diff --git a/.classpath b/.classpath
index 9d1298ecb..902041fc9 100644
--- a/.classpath
+++ b/.classpath
@@ -7,6 +7,7 @@
-
+
+
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a6eb0171d..a1b05d19f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2,7 +2,7 @@
-
+
@@ -39,6 +39,7 @@
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar"
android:launchMode="singleTask"
+ android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
>
@@ -76,7 +77,7 @@
+ android:configChanges="keyboardHidden|orientation">
@@ -94,14 +95,16 @@
-
+
+ android:launchMode="singleTop"
+ android:configChanges="orientation">
diff --git a/jni/Android.mk b/jni/Android.mk
index b55653673..766543a96 100755
--- a/jni/Android.mk
+++ b/jni/Android.mk
@@ -94,6 +94,7 @@ endif
ifeq ($(wildcard $(linphone-root-dir)/submodules/externals/prebuilts/ffmpeg.mk),)
include $(linphone-root-dir)/submodules/externals/build/ffmpeg/Android.mk
+include $(linphone-root-dir)/submodules/externals/build/ffmpeg-no-neon/Android.mk
else
include $(linphone-root-dir)/submodules/externals/prebuilts/ffmpeg.mk
endif
@@ -117,6 +118,7 @@ endif
include $(linphone-root-dir)/submodules/linphone/build/android/Android.mk
+include $(linphone-root-dir)/submodules/linphone/build/android/Android-no-neon.mk
_BUILD_AMR=0
ifneq ($(BUILD_AMRNB), 0)
diff --git a/jni/Application.mk b/jni/Application.mk
index 95a3fa7b5..c67dc451a 100644
--- a/jni/Application.mk
+++ b/jni/Application.mk
@@ -1,5 +1,5 @@
APP_PROJECT_PATH := $(call my-dir)/../
-APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone
+APP_MODULES :=libspeex libgsm libortp libosip2 libeXosip2 libmediastreamer2 liblinphone liblinphonenoneon
APP_STL := stlport_static
#default values
@@ -14,7 +14,9 @@ BUILD_SRTP=1
endif
ifeq ($(LINPHONE_VIDEO),1)
-APP_MODULES += libavutil libavcore libavcodec libswscale libvpx
+APP_MODULES += libavutil libavcore libavcodec libswscale
+APP_MODULES += libavutilnoneon libavcorenoneon libavcodecnoneon libswscalenoneon
+APP_MODULES += libvpx
endif
_BUILD_AMR=0
diff --git a/res/layout-xlarge/dialer.xml b/res/layout-xlarge/dialer.xml
new file mode 100644
index 000000000..9d0dbba6a
--- /dev/null
+++ b/res/layout-xlarge/dialer.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/res/layout-xlarge/incall_layout.xml b/res/layout-xlarge/incall_layout.xml
new file mode 100644
index 000000000..5c69a2997
--- /dev/null
+++ b/res/layout-xlarge/incall_layout.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/layout-xlarge/videocall.xml b/res/layout-xlarge/videocall.xml
new file mode 100755
index 000000000..b5b8f178f
--- /dev/null
+++ b/res/layout-xlarge/videocall.xml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/org/linphone/AbstractCalleesActivity.java b/src/org/linphone/AbstractCalleesActivity.java
index c88db583b..a46a9bf3f 100644
--- a/src/org/linphone/AbstractCalleesActivity.java
+++ b/src/org/linphone/AbstractCalleesActivity.java
@@ -31,6 +31,7 @@ import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCall.State;
import org.linphone.core.LinphoneCore;
import org.linphone.core.Log;
+import org.linphone.ui.ToggleImageButton;
import android.app.ListActivity;
import android.net.Uri;
@@ -85,6 +86,11 @@ public abstract class AbstractCalleesActivity extends ListActivity implements Li
View speaker = findViewById(R.id.toggleSpeaker);
speaker.setOnClickListener(this);
mSpeakerButton = (Checkable) speaker;
+ if (LinphoneManager.getInstance().isSpeakerOn())
+ {
+ ((ToggleImageButton) speaker).setChecked(true);
+ speaker.setEnabled(false);
+ }
super.onCreate(savedInstanceState);
}
diff --git a/src/org/linphone/DialerActivity.java b/src/org/linphone/DialerActivity.java
index 8266fee9b..a39671cfa 100644
--- a/src/org/linphone/DialerActivity.java
+++ b/src/org/linphone/DialerActivity.java
@@ -25,11 +25,15 @@ import org.linphone.LinphoneService.LinphoneGuiListener;
import org.linphone.core.LinphoneCall;
import org.linphone.core.LinphoneCall.State;
import org.linphone.core.LinphoneCore.RegistrationState;
+import org.linphone.core.LinphoneCoreException;
import org.linphone.core.LinphoneProxyConfig;
import org.linphone.core.Log;
+import org.linphone.mediastream.Version;
+import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
import org.linphone.ui.AddressAware;
import org.linphone.ui.AddressText;
import org.linphone.ui.CallButton;
+import org.linphone.ui.CameraView;
import org.linphone.ui.EraseButton;
import android.app.Activity;
@@ -37,6 +41,9 @@ import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
+import android.content.pm.ActivityInfo;
+import android.hardware.Camera;
+import android.hardware.Camera.CameraInfo;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
@@ -46,6 +53,7 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Adapter;
import android.widget.Button;
+import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
@@ -72,6 +80,8 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
private AddressText mAddress;
private CallButton mCall;
+ private Button mBack, mAddCall, mSwitchCamera;
+ private LinearLayout mInCallControls;
private static DialerActivity instance;
private boolean mPreventDoubleCallOnRotation;
@@ -79,6 +89,12 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
private AlertDialog wizardDialog;
protected String username;
private String key;
+
+ private CameraView mVideoCaptureView;
+ private int mCurrentCameraId = 0;
+
+ private Camera mCamera;
+
private static final String CURRENT_ADDRESS = "org.linphone.current-address";
private static final String CURRENT_DISPLAYNAME = "org.linphone.current-displayname";
@@ -189,16 +205,24 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
}
public void onCreate(Bundle savedInstanceState) {
+ if (Version.isXLargeScreen(this)) {
+ this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
+ }
setContentView(R.layout.dialer);
mAddress = (AddressText) findViewById(R.id.SipUri);
- ((EraseButton) findViewById(R.id.Erase)).setAddressWidget(mAddress);
-
+ EraseButton erase = (EraseButton) findViewById(R.id.Erase);
+ erase.setAddressWidget(mAddress);
+ erase.requestFocus();
mCall = (CallButton) findViewById(R.id.Call);
mCall.setAddressWidget(mAddress);
-
+ mBack = (Button) findViewById(R.id.Back);
+ mAddCall = (Button) findViewById(R.id.AddCall);
+ mInCallControls = (LinearLayout) findViewById(R.id.InCallControls);
mStatus = (TextView) findViewById(R.id.status_label);
+
+ tryToInitTabletUI();
SlidingDrawer drawer = (SlidingDrawer) findViewById(R.id.drawer);
if (drawer != null) {
@@ -235,10 +259,84 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
verifiyAccountsActivated();
displayRegisterStatus();
+ mCall.requestFocus();
}
- private void checkIfOutgoingCallIntentReceived() {
+ private synchronized void tryToInitTabletUI() {
+ final int numberOfCameras = Camera.getNumberOfCameras();
+
+ CameraInfo cameraInfo = new CameraInfo();
+ for (int i = 0; i < numberOfCameras; i++) {
+ Camera.getCameraInfo(i, cameraInfo);
+ if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
+ mCurrentCameraId = i;
+ }
+ }
+
+ mVideoCaptureView = (CameraView) findViewById(R.id.video_background);
+ if (mVideoCaptureView != null)
+ {
+ if (mCamera == null) {
+ mCamera = Camera.open(mCurrentCameraId);
+ }
+ mVideoCaptureView.setCamera(mCamera, mCurrentCameraId);
+ mCamera.startPreview();
+ }
+
+ mSwitchCamera = (Button) findViewById(R.id.switch_camera);
+ if (mSwitchCamera != null)
+ {
+ if (AndroidCameraConfiguration.hasSeveralCameras())
+ mSwitchCamera.setVisibility(View.VISIBLE);
+
+ mSwitchCamera.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ mCurrentCameraId = (mCurrentCameraId + 1) % numberOfCameras;
+ mCamera.release();
+ mVideoCaptureView.setCamera(null, -1);
+
+ mCamera = Camera.open(mCurrentCameraId);
+ mVideoCaptureView.switchCamera(mCamera, mCurrentCameraId);
+ mCamera.startPreview();
+ }
+ });
+ }
+
+ if (mBack != null) {
+ mBack.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ LinphoneCall call = LinphoneManager.getLc().getCurrentCall();
+ if (call.getCurrentParamsCopy().getVideoEnabled())
+ LinphoneActivity.instance().startVideoActivity(call, 0);
+ else
+ LinphoneActivity.instance().startIncallActivity();
+ }
+ });
+ }
+
+ if (mAddCall != null) {
+ mAddCall.setOnClickListener(new OnClickListener() {
+ public void onClick(View v) {
+ LinphoneCall call = LinphoneManager.getLc().getCurrentCall();
+ if (call != null && !call.isInConference()) {
+ LinphoneManager.getLc().pauseCall(call);
+ } else {
+ LinphoneManager.getLc().leaveConference();
+ }
+
+ try {
+ LinphoneManager.getLc().invite(mAddress.getText().toString());
+ } catch (LinphoneCoreException e) {
+ Log.e(e);
+ Toast.makeText(DialerActivity.this, R.string.error_adding_new_call, Toast.LENGTH_LONG).show();
+ }
+ }
+ });
+ }
+ }
+
+ private void checkIfOutgoingCallIntentReceived() {
if (getIntent().getData() == null) return;
if (!LinphoneService.isReady() || LinphoneManager.getLc().isIncall()) {
@@ -256,7 +354,16 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
+ @Override
+ protected void onPause() {
+ super.onPause();
+ if (mCamera != null) {
+ mCamera.release();
+ mVideoCaptureView.setCamera(null, -1);
+ mCamera = null;
+ }
+ }
@@ -361,7 +468,21 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
}
@Override
- public void onCallStateChanged(LinphoneCall call, State s, String m) {}
+ public void onCallStateChanged(LinphoneCall call, State s, String m) {
+ if (mVideoCaptureView != null && mCamera == null && !LinphoneManager.getLc().isIncall())
+ {
+ if (mInCallControls != null)
+ mInCallControls.setVisibility(View.GONE);
+ mCall.setVisibility(View.VISIBLE);
+
+ if (AndroidCameraConfiguration.hasSeveralCameras() && mSwitchCamera != null)
+ mSwitchCamera.setVisibility(View.VISIBLE);
+
+ mCamera = Camera.open(mCurrentCameraId);
+ mVideoCaptureView.switchCamera(mCamera, mCurrentCameraId);
+ mCamera.startPreview();
+ }
+ }
public void onGlobalStateChangedToOn(String message) {
mCall.setEnabled(!LinphoneManager.getLc().isIncall());
@@ -380,8 +501,31 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
// Note1: We wait as long as possible before setting the last message.
// Note2: Linphone service is in charge of instantiating LinphoneManager
mStatus.setText(LinphoneManager.getInstance().getLastLcStatusMessage());
-
+
super.onResume();
+
+ if (mInCallControls != null)
+ mInCallControls.setVisibility(View.GONE);
+ mCall.setVisibility(View.VISIBLE);
+
+ if (AndroidCameraConfiguration.hasSeveralCameras() && mSwitchCamera != null)
+ mSwitchCamera.setVisibility(View.VISIBLE);
+
+ if (mVideoCaptureView != null && mCamera == null && !LinphoneManager.getLc().isIncall())
+ {
+ mCamera = Camera.open(mCurrentCameraId);
+ mVideoCaptureView.switchCamera(mCamera, mCurrentCameraId);
+ mCamera.startPreview();
+ } else if (LinphoneManager.getLc().isIncall())
+ {
+ if (mInCallControls != null) {
+ mInCallControls.setVisibility(View.VISIBLE);
+ mCall.setVisibility(View.GONE);
+ }
+
+ if (mSwitchCamera != null)
+ mSwitchCamera.setVisibility(View.INVISIBLE);
+ }
}
@@ -390,5 +534,4 @@ public class DialerActivity extends Activity implements LinphoneGuiListener {
if (LinphoneUtils.onKeyVolumeSoftAdjust(keyCode)) return true;
return super.onKeyDown(keyCode, event);
}
-
}
diff --git a/src/org/linphone/IncallActivity.java b/src/org/linphone/IncallActivity.java
index e1ae18403..c7084bcf0 100644
--- a/src/org/linphone/IncallActivity.java
+++ b/src/org/linphone/IncallActivity.java
@@ -42,8 +42,11 @@ import org.linphone.ui.Numpad;
import android.app.AlertDialog;
import android.app.Dialog;
+import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Bundle;
import android.os.CountDownTimer;
@@ -107,12 +110,15 @@ public class IncallActivity extends AbstractCalleesActivity implements
private View mConferenceVirtualCallee;
private int mMultipleCallsLimit;
private boolean mAllowTransfers;
-
+
@Override
protected void onCreate(Bundle savedInstanceState) {
if (finishIfAutoRestartAfterACrash(savedInstanceState)) {
return;
}
+ if (!Version.isXLargeScreen(this))
+ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+
setContentView(R.layout.incall_layout);
instance = this;
@@ -318,7 +324,7 @@ public class IncallActivity extends AbstractCalleesActivity implements
public void onClick(View v) {
switch (v.getId()) {
case R.id.addCall:
- openUriPicker(UriPickerActivity.EXTRA_PICKER_TYPE_ADD, addCallId);
+ finish();
break;
case R.id.incallHang:
terminateCurrentCallOrConferenceOrAll();
@@ -346,7 +352,8 @@ public class IncallActivity extends AbstractCalleesActivity implements
((Checkable) v).setChecked(true);
List pausedCalls = LinphoneUtils.getCallsInState(lc(), Arrays.asList(State.Paused));
if (pausedCalls.size() == 1) {
- lc().resumeCall(pausedCalls.get(0));
+ LinphoneCall callToResume = pausedCalls.get(0);
+ lc().resumeCall(callToResume);
}
}
break;
@@ -588,6 +595,11 @@ public class IncallActivity extends AbstractCalleesActivity implements
} else if (lc().soundResourcesLocked()) {
return;
} else if (State.Paused == actualState) {
+ if (call != null && call.cameraEnabled() && call.getCurrentParamsCopy().getVideoEnabled())
+ {
+ finish();
+ LinphoneActivity.instance().startVideoActivity(call, 0);
+ }
lc().resumeCall(call);
}
}
@@ -651,6 +663,18 @@ public class IncallActivity extends AbstractCalleesActivity implements
mergeView.setVisibility(VISIBLE);
}
}
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig)
+ {
+ if (!Version.isXLargeScreen(this))
+ {
+ // Do nothing to not recreate the activity on smartphone if screen is rotated
+ super.onConfigurationChanged(null);
+ return;
+ }
+ super.onConfigurationChanged(newConfig);
+ }
private void updateConfItem() {
boolean confExists = lc().getConferenceSize() > 0;
diff --git a/src/org/linphone/IncomingCallActivity.java b/src/org/linphone/IncomingCallActivity.java
index 8e7b43399..f7afc26fc 100644
--- a/src/org/linphone/IncomingCallActivity.java
+++ b/src/org/linphone/IncomingCallActivity.java
@@ -141,7 +141,10 @@ public class IncomingCallActivity extends Activity implements LinphoneOnCallStat
// the above method takes care of Samsung Galaxy S
Toast.makeText(this, R.string.couldnt_accept_call, Toast.LENGTH_LONG);
} else {
- LinphoneActivity.instance().startIncallActivity();
+ if (mCall.getCurrentParamsCopy().getVideoEnabled())
+ LinphoneActivity.instance().startVideoActivity(mCall, 0);
+ else
+ LinphoneActivity.instance().startIncallActivity();
}
}
@Override
diff --git a/src/org/linphone/LinphoneActivity.java b/src/org/linphone/LinphoneActivity.java
index 08a78a25b..0a7aa174b 100644
--- a/src/org/linphone/LinphoneActivity.java
+++ b/src/org/linphone/LinphoneActivity.java
@@ -23,10 +23,10 @@ import static android.content.Intent.ACTION_MAIN;
import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener;
import org.linphone.core.LinphoneCall;
-import org.linphone.core.LinphoneCore;
-import org.linphone.core.Log;
import org.linphone.core.LinphoneCall.State;
+import org.linphone.core.LinphoneCore;
import org.linphone.core.LinphoneCore.RegistrationState;
+import org.linphone.core.Log;
import org.linphone.mediastream.Version;
import android.app.AlertDialog;
@@ -46,10 +46,10 @@ import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.OrientationEventListener;
+import android.widget.TabHost.TabSpec;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.Toast;
-import android.widget.TabHost.TabSpec;
public class LinphoneActivity extends TabActivity implements ContactPicked
, LinphoneOnCallStateChangedListener
@@ -190,7 +190,16 @@ public class LinphoneActivity extends TabActivity implements ContactPicked
if(LinphoneManager.getLc().isInComingInvitePending()) {
startIncomingCallActivity();
} else {
- startIncallActivity();
+ LinphoneCall currentCall = LinphoneManager.getLc().getCurrentCall();
+ if (currentCall == null)
+ return;
+
+ if (currentCall.getCurrentParamsCopy().getVideoEnabled()) {
+ currentCall.enableCamera(true);
+ startVideoActivity(currentCall, 0);
+ }
+ else
+ startIncallActivity();
}
return;
}
@@ -461,30 +470,43 @@ public class LinphoneActivity extends TabActivity implements ContactPicked
}
if (state==State.IncomingReceived) {
- if (call.getCurrentParamsCopy().getVideoEnabled()) startOrientationSensor();
+ if (call.getCurrentParamsCopy().getVideoEnabled())
+ startOrientationSensor();
startIncomingCallActivity();
}
if (state == State.OutgoingInit) {
- if (call.getCurrentParamsCopy().getVideoEnabled()) startOrientationSensor();
- startIncallActivity();
+ if (call.getCurrentParamsCopy().getVideoEnabled()) {
+ startOrientationSensor();
+ startVideoActivity(call, 0);
+ } else {
+ startIncallActivity();
+ }
}
if (state == LinphoneCall.State.StreamsRunning && Version.isVideoCapable() && !call.isInConference()) {
// call.cameraEnabled() contains the wish of the user
// set in LinphoneManager#onCallStateChanged(OutgoingInit||IncomingReceived)
- boolean videoEnabled = call.cameraEnabled() && call.getCurrentParamsCopy().getVideoEnabled();
+ boolean videoEnabled = call.getCurrentParamsCopy().getVideoEnabled();
if (videoEnabled) {
- startVideoActivity(call, 1000);
+ finishActivity(incall_activity);
+ startVideoActivity(call, 0);
} else {
finishActivity(video_activity);
+ startIncallActivity();
}
}
if (state == LinphoneCall.State.CallUpdatedByRemote && Version.isVideoCapable()) {
if (VideoCallActivity.launched && !call.getCurrentParamsCopy().getVideoEnabled()) {
finishActivity(video_activity);
+ startIncallActivity();
}
}
+
+ if (state == LinphoneCall.State.PausedByRemote) {
+ finishActivity(video_activity);
+ startIncallActivity();
+ }
if (state==State.Error){
showToast(R.string.call_error, message);
diff --git a/src/org/linphone/LinphonePreferencesActivity.java b/src/org/linphone/LinphonePreferencesActivity.java
index 53ac52280..191031afd 100644
--- a/src/org/linphone/LinphonePreferencesActivity.java
+++ b/src/org/linphone/LinphonePreferencesActivity.java
@@ -618,7 +618,13 @@ public class LinphonePreferencesActivity extends PreferenceActivity implements E
detectVideoCodec(R.string.pref_video_codec_h264_key, "H264");
-
+ if (!Version.hasNeon())
+ {
+ // Android without neon doesn't support H264
+ findPreference(R.string.pref_video_codec_h264_key).setEnabled(false);
+ findPreference(R.string.pref_video_codec_h264_key).setDefaultValue(false);
+ }
+
addEchoPrefsListener();
if (Hacks.needSoftvolume()) checkAndDisableCheckbox(R.string.pref_audio_soft_volume_key);
diff --git a/src/org/linphone/VideoCallActivity.java b/src/org/linphone/VideoCallActivity.java
index 05d7cc123..56c47edfe 100755
--- a/src/org/linphone/VideoCallActivity.java
+++ b/src/org/linphone/VideoCallActivity.java
@@ -18,51 +18,76 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.linphone;
-
-
import org.linphone.LinphoneSimpleListener.LinphoneOnCallStateChangedListener;
import org.linphone.core.LinphoneCall;
-import org.linphone.core.Log;
import org.linphone.core.LinphoneCall.State;
+import org.linphone.core.LinphoneCallParams;
+import org.linphone.core.Log;
+import org.linphone.mediastream.Version;
import org.linphone.mediastream.video.AndroidVideoWindowImpl;
import org.linphone.mediastream.video.capture.hwconf.AndroidCameraConfiguration;
+import org.linphone.ui.Numpad;
+import org.linphone.ui.ToggleImageButton;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.Context;
+import android.content.DialogInterface;
+import android.content.res.Configuration;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
+import android.view.Display;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.View.OnTouchListener;
+import android.view.WindowManager;
+import android.widget.Checkable;
import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.RelativeLayout.LayoutParams;
/**
* For Android SDK >= 5
+ *
* @author Guillaume Beraudo
- *
+ *
*/
-public class VideoCallActivity extends Activity implements LinphoneOnCallStateChangedListener {
+public class VideoCallActivity extends Activity implements
+ LinphoneOnCallStateChangedListener, OnClickListener {
+ private final static int DELAY_BEFORE_HIDING_CONTROLS = 2000;
+ private static final int numpadDialogId = 1;
+
private SurfaceView mVideoViewReady;
private SurfaceView mVideoCaptureViewReady;
public static boolean launched = false;
private LinphoneCall videoCall;
private WakeLock mWakeLock;
private Handler refreshHandler = new Handler();
-
+ private Handler controlsHandler = new Handler();
AndroidVideoWindowImpl androidVideoWindowImpl;
- private Runnable mCallQualityUpdater;
+ private Runnable mCallQualityUpdater, mControls;
+ private LinearLayout mControlsLayout;
+ private boolean shouldRestartVideoOnResume = false;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if (!LinphoneManager.isInstanciated() || LinphoneManager.getLc().getCallsNb() == 0) {
- Log.e("No service running: avoid crash by finishing ", getClass().getName());
+ if (!LinphoneManager.isInstanciated()
+ || LinphoneManager.getLc().getCallsNb() == 0) {
+ Log.e("No service running: avoid crash by finishing ", getClass()
+ .getName());
// super.onCreate called earlier
finish();
return;
@@ -70,128 +95,136 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
setContentView(R.layout.videocall);
- SurfaceView videoView = (SurfaceView) findViewById(R.id.video_surface);
+ SurfaceView videoView = (SurfaceView) findViewById(R.id.video_surface);
+
+ // ((FrameLayout)
+ // findViewById(R.id.video_frame)).bringChildToFront(findViewById(R.id.imageView1));
- //((FrameLayout) findViewById(R.id.video_frame)).bringChildToFront(findViewById(R.id.imageView1));
-
SurfaceView captureView = (SurfaceView) findViewById(R.id.video_capture_surface);
- captureView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+ captureView.getHolder()
+ .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
/* force surfaces Z ordering */
fixZOrder(videoView, captureView);
-
- androidVideoWindowImpl = new AndroidVideoWindowImpl(videoView, captureView);
- androidVideoWindowImpl.setListener(new AndroidVideoWindowImpl.VideoWindowListener() {
-
- public void onVideoRenderingSurfaceReady(AndroidVideoWindowImpl vw, SurfaceView surface) {
- LinphoneManager.getLc().setVideoWindow(vw);
- mVideoViewReady = surface;
- }
-
- public void onVideoRenderingSurfaceDestroyed(AndroidVideoWindowImpl vw) {
- Log.d("VIDEO WINDOW destroyed!\n");
- LinphoneManager.getLc().setVideoWindow(null);
- }
-
- public void onVideoPreviewSurfaceReady(AndroidVideoWindowImpl vw, SurfaceView surface) {
- mVideoCaptureViewReady = surface;
- LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady);
- }
-
- public void onVideoPreviewSurfaceDestroyed(AndroidVideoWindowImpl vw) {
- // Remove references kept in jni code and restart camera
- // LinphoneManager.getLc().setPreviewWindow(null);
- // Commented to remove flicker.
- }
- });
-
+
+ androidVideoWindowImpl = new AndroidVideoWindowImpl(videoView,
+ captureView);
+ androidVideoWindowImpl
+ .setListener(new AndroidVideoWindowImpl.VideoWindowListener() {
+
+ public void onVideoRenderingSurfaceReady(
+ AndroidVideoWindowImpl vw, SurfaceView surface) {
+ LinphoneManager.getLc().setVideoWindow(vw);
+ mVideoViewReady = surface;
+ }
+
+ public void onVideoRenderingSurfaceDestroyed(
+ AndroidVideoWindowImpl vw) {
+ Log.d("VIDEO WINDOW destroyed!\n");
+ LinphoneManager.getLc().setVideoWindow(null);
+ }
+
+ public void onVideoPreviewSurfaceReady(
+ AndroidVideoWindowImpl vw, SurfaceView surface) {
+ mVideoCaptureViewReady = surface;
+ LinphoneManager.getLc().setPreviewWindow(
+ mVideoCaptureViewReady);
+ }
+
+ public void onVideoPreviewSurfaceDestroyed(
+ AndroidVideoWindowImpl vw) {
+ // Remove references kept in jni code and restart camera
+ LinphoneManager.getLc().setPreviewWindow(null);
+ }
+ });
+
androidVideoWindowImpl.init();
videoCall = LinphoneManager.getLc().getCurrentCall();
if (videoCall != null) {
LinphoneManager lm = LinphoneManager.getInstance();
- if (!lm.shareMyCamera() && !lm.isVideoInitiator() && videoCall.cameraEnabled()) {
+ if (!lm.shareMyCamera() && !lm.isVideoInitiator()
+ && videoCall.cameraEnabled()) {
lm.sendStaticImage(true);
}
-
+
updatePreview(videoCall.cameraEnabled());
}
-
- PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
- mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE,Log.TAG);
+
+ PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
+ mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK
+ | PowerManager.ON_AFTER_RELEASE, Log.TAG);
mWakeLock.acquire();
-
+
+ mControlsLayout = (LinearLayout) findViewById(R.id.incall_controls_layout);
+ videoView.setOnTouchListener(new OnTouchListener() {
+ public boolean onTouch(View v, MotionEvent event) {
+ if (mControlsLayout != null
+ && mControlsLayout.getVisibility() == View.GONE) {
+ mControlsLayout.setVisibility(View.VISIBLE);
+ controlsHandler.postDelayed(mControls = new Runnable() {
+ public void run() {
+ mControlsLayout.setVisibility(View.GONE);
+ }
+ }, DELAY_BEFORE_HIDING_CONTROLS);
+
+ return true;
+ }
+ return false;
+ }
+ });
+
+ if (!AndroidCameraConfiguration.hasSeveralCameras()) {
+ findViewById(R.id.switch_camera).setVisibility(View.GONE);
+ }
+
+ if (Version.isXLargeScreen(this)) {
+ findViewById(R.id.toggleMuteMic).setOnClickListener(this);
+ findViewById(R.id.toggleSpeaker).setOnClickListener(this);
+ findViewById(R.id.incallNumpadShow).setOnClickListener(this);
+ findViewById(R.id.addCall).setOnClickListener(this);
+ findViewById(R.id.incallHang).setOnClickListener(this);
+ findViewById(R.id.switch_camera).setOnClickListener(this);
+ findViewById(R.id.conf_simple_pause).setOnClickListener(this);
+ findViewById(R.id.conf_simple_video).setOnClickListener(this);
+
+ if (LinphoneManager.getInstance().isSpeakerOn()) {
+ ToggleImageButton speaker = (ToggleImageButton) findViewById(R.id.toggleSpeaker);
+ speaker.setChecked(true);
+ speaker.setEnabled(false);
+ }
+ }
+
+ // Hack to force the redraw of the preview
+ // Camera will be re-enabled in onResume just after anyway
+ shouldRestartVideoOnResume = true;
+ LinphoneManager.getLc().getCurrentCall().enableCamera(false);
}
-
- void updateQualityOfSignalIcon(float quality)
- {
+
+ void updateQualityOfSignalIcon(float quality) {
ImageView qos = (ImageView) findViewById(R.id.QoS);
if (quality >= 4) // Good Quality
{
- qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_4));
- }
- else if (quality >= 3) // Average quality
+ qos.setImageDrawable(getResources().getDrawable(
+ R.drawable.stat_sys_signal_4));
+ } else if (quality >= 3) // Average quality
{
- qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_3));
- }
- else if (quality >= 2) // Low quality
+ qos.setImageDrawable(getResources().getDrawable(
+ R.drawable.stat_sys_signal_3));
+ } else if (quality >= 2) // Low quality
{
- qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_2));
- }
- else if (quality >= 1) // Very low quality
+ qos.setImageDrawable(getResources().getDrawable(
+ R.drawable.stat_sys_signal_2));
+ } else if (quality >= 1) // Very low quality
{
- qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_1));
- }
- else // Worst quality
+ qos.setImageDrawable(getResources().getDrawable(
+ R.drawable.stat_sys_signal_1));
+ } else // Worst quality
{
- qos.setImageDrawable(getResources().getDrawable(R.drawable.stat_sys_signal_0));
+ qos.setImageDrawable(getResources().getDrawable(
+ R.drawable.stat_sys_signal_0));
}
}
-
- void updatePreview(boolean cameraCaptureEnabled) {
- mVideoCaptureViewReady = null;
- if (cameraCaptureEnabled) {
- findViewById(R.id.imageView1).setVisibility(View.INVISIBLE);
- findViewById(R.id.video_capture_surface).setVisibility(View.VISIBLE);
- } else {
- findViewById(R.id.video_capture_surface).setVisibility(View.INVISIBLE);
- findViewById(R.id.imageView1).setVisibility(View.VISIBLE);
- }
- findViewById(R.id.video_frame).requestLayout();
- }
-
- void fixZOrder(SurfaceView video, SurfaceView preview) {
- video.setZOrderOnTop(false);
- preview.setZOrderOnTop(true);
- }
-
-
- @Override
- protected void onResume() {
- super.onResume();
- if (mVideoViewReady != null)
- ((GLSurfaceView)mVideoViewReady).onResume();
- launched=true;
- LinphoneManager.addListener(this);
- refreshHandler.postDelayed(mCallQualityUpdater=new Runnable(){
- LinphoneCall mCurrentCall=LinphoneManager.getLc().getCurrentCall();
- public void run() {
- if (mCurrentCall==null){
- mCallQualityUpdater=null;
- return;
- }
- int oldQuality = 0;
- float newQuality = mCurrentCall.getCurrentQuality();
- if ((int) newQuality != oldQuality){
- updateQualityOfSignalIcon(newQuality);
- }
- if (launched){
- refreshHandler.postDelayed(this, 1000);
- }else mCallQualityUpdater=null;
- }
- },1000);
- }
-
private void rewriteToggleCameraItem(MenuItem item) {
if (LinphoneManager.getLc().getCurrentCall().cameraEnabled()) {
@@ -201,7 +234,6 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
}
}
-
private void rewriteChangeResolutionItem(MenuItem item) {
if (BandwidthManager.getInstance().isUserRestriction()) {
item.setTitle(getString(R.string.menu_videocall_change_resolution_when_low_resolution));
@@ -210,15 +242,19 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
}
}
-
@Override
public boolean onCreateOptionsMenu(Menu menu) {
+ if (Version.isXLargeScreen(this))
+ return false;
+
// Inflate the currently selected menu XML resource.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.videocall_activity_menu, menu);
- rewriteToggleCameraItem(menu.findItem(R.id.videocall_menu_toggle_camera));
- rewriteChangeResolutionItem(menu.findItem(R.id.videocall_menu_change_resolution));
+ rewriteToggleCameraItem(menu
+ .findItem(R.id.videocall_menu_toggle_camera));
+ rewriteChangeResolutionItem(menu
+ .findItem(R.id.videocall_menu_change_resolution));
if (!AndroidCameraConfiguration.hasSeveralCameras()) {
menu.findItem(R.id.videocall_menu_switch_camera).setVisible(false);
@@ -231,26 +267,32 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
switch (item.getItemId()) {
case R.id.videocall_menu_back_to_dialer:
finish();
+ LinphoneActivity.instance().startIncallActivity();
break;
case R.id.videocall_menu_change_resolution:
LinphoneManager.getInstance().changeResolution();
- // previous call will cause graph reconstruction -> regive preview window
+ // previous call will cause graph reconstruction -> regive preview
+ // window
if (mVideoCaptureViewReady != null)
- LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady);
+ LinphoneManager.getLc()
+ .setPreviewWindow(mVideoCaptureViewReady);
rewriteChangeResolutionItem(item);
break;
case R.id.videocall_menu_terminate_call:
LinphoneManager.getInstance().terminateCall();
break;
case R.id.videocall_menu_toggle_camera:
- boolean camEnabled = LinphoneManager.getInstance().toggleEnableCamera();
+ boolean camEnabled = LinphoneManager.getInstance()
+ .toggleEnableCamera();
updatePreview(camEnabled);
Log.e("winwow camera enabled: " + camEnabled);
rewriteToggleCameraItem(item);
- // previous call will cause graph reconstruction -> regive preview window
+ // previous call will cause graph reconstruction -> regive preview
+ // window
if (camEnabled) {
if (mVideoCaptureViewReady != null)
- LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady);
+ LinphoneManager.getLc().setPreviewWindow(
+ mVideoCaptureViewReady);
} else
LinphoneManager.getLc().setPreviewWindow(null);
break;
@@ -259,26 +301,92 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
id = (id + 1) % AndroidCameraConfiguration.retrieveCameras().length;
LinphoneManager.getLc().setVideoDevice(id);
CallManager.getInstance().updateCall();
- // previous call will cause graph reconstruction -> regive preview window
+ // previous call will cause graph reconstruction -> regive preview
+ // window
if (mVideoCaptureViewReady != null)
- LinphoneManager.getLc().setPreviewWindow(mVideoCaptureViewReady);
+ LinphoneManager.getLc()
+ .setPreviewWindow(mVideoCaptureViewReady);
break;
default:
- Log.e("Unknown menu item [",item,"]");
+ Log.e("Unknown menu item [", item, "]");
break;
- }
+ }
return true;
}
+ void updatePreview(boolean cameraCaptureEnabled) {
+ mVideoCaptureViewReady = null;
+ if (cameraCaptureEnabled) {
+ findViewById(R.id.imageView1).setVisibility(View.INVISIBLE);
+ findViewById(R.id.video_capture_surface)
+ .setVisibility(View.VISIBLE);
+ } else {
+ findViewById(R.id.video_capture_surface).setVisibility(
+ View.INVISIBLE);
+ findViewById(R.id.imageView1).setVisibility(View.VISIBLE);
+ }
+ findViewById(R.id.video_frame).requestLayout();
+ }
+
+ void fixZOrder(SurfaceView video, SurfaceView preview) {
+ video.setZOrderOnTop(false);
+ preview.setZOrderOnTop(true);
+ }
+
@Override
+ protected void onResume() {
+ super.onResume();
+ if (mVideoViewReady != null)
+ ((GLSurfaceView) mVideoViewReady).onResume();
+ synchronized (androidVideoWindowImpl) {
+ LinphoneManager.getLc().setVideoWindow(androidVideoWindowImpl);
+ }
+ launched = true;
+ LinphoneManager.addListener(this);
+
+ refreshHandler.postDelayed(mCallQualityUpdater = new Runnable() {
+ LinphoneCall mCurrentCall = LinphoneManager.getLc()
+ .getCurrentCall();
+
+ public void run() {
+ if (mCurrentCall == null) {
+ mCallQualityUpdater = null;
+ return;
+ }
+ int oldQuality = 0;
+ float newQuality = mCurrentCall.getCurrentQuality();
+ if ((int) newQuality != oldQuality) {
+ updateQualityOfSignalIcon(newQuality);
+ }
+ if (launched) {
+ refreshHandler.postDelayed(this, 1000);
+ } else
+ mCallQualityUpdater = null;
+ }
+ }, 1000);
+
+ if (mControlsLayout != null)
+ mControlsLayout.setVisibility(View.GONE);
+
+ if (shouldRestartVideoOnResume) {
+ LinphoneManager.getLc().getCurrentCall().enableCamera(true);
+ shouldRestartVideoOnResume = false;
+ }
+ }
+
public boolean onKeyDown(int keyCode, KeyEvent event) {
- if (LinphoneUtils.onKeyVolumeSoftAdjust(keyCode)) return true;
+ if (LinphoneUtils.onKeyVolumeSoftAdjust(keyCode))
+ return true;
+ if (Version.isXLargeScreen(this) && LinphoneUtils.onKeyBackGoHome(this, keyCode, event))
+ return true;
return super.onKeyDown(keyCode, event);
}
@Override
protected void onDestroy() {
- if (androidVideoWindowImpl != null) { // Prevent linphone from crashing if correspondent hang up while you are rotating
+ if (androidVideoWindowImpl != null) { // Prevent linphone from crashing
+ // if correspondent hang up
+ // while you are rotating
androidVideoWindowImpl.release();
}
super.onDestroy();
@@ -286,28 +394,40 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
@Override
protected void onPause() {
- Log.d("onPause VideoCallActivity (isFinishing:", isFinishing(), ", inCall:", LinphoneManager.getLc().isIncall(),")");
+ Log.d("onPause VideoCallActivity (isFinishing:", isFinishing(),
+ ", inCall:", LinphoneManager.getLc().isIncall(), ")");
LinphoneManager.removeListener(this);
if (isFinishing()) {
videoCall = null; // release reference
+ } else {
+ // Send NoWebcam since Android 4.0 can't get the video from the
+ // webcam if the activity is not in foreground
+ shouldRestartVideoOnResume = true;
+ LinphoneManager.getLc().getCurrentCall().enableCamera(false);
}
- launched=false;
+ launched = false;
synchronized (androidVideoWindowImpl) {
- /* this call will destroy native opengl renderer
- * which is used by androidVideoWindowImpl
+ /*
+ * this call will destroy native opengl renderer which is used by
+ * androidVideoWindowImpl
*/
LinphoneManager.getLc().setVideoWindow(null);
}
- if (mCallQualityUpdater!=null){
+ if (mCallQualityUpdater != null) {
refreshHandler.removeCallbacks(mCallQualityUpdater);
- mCallQualityUpdater=null;
+ mCallQualityUpdater = null;
}
-
- if (mWakeLock.isHeld()) mWakeLock.release();
+ if (mControls != null) {
+ controlsHandler.removeCallbacks(mControls);
+ mControls = null;
+ }
+
+ if (mWakeLock.isHeld())
+ mWakeLock.release();
super.onPause();
if (mVideoViewReady != null)
- ((GLSurfaceView)mVideoViewReady).onPause();
+ ((GLSurfaceView) mVideoViewReady).onPause();
}
@Override
@@ -319,4 +439,123 @@ public class VideoCallActivity extends Activity implements LinphoneOnCallStateCh
finish();
}
}
+
+ private void resizePreview() {
+ Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
+ .getDefaultDisplay();
+ int rotation = display.getRotation();
+ LayoutParams params;
+
+ int w, h;
+ if (Version.isXLargeScreen(this)) {
+ w = 176;
+ h = 148;
+ } else {
+ w = 88;
+ h = 74;
+ }
+
+ if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
+ params = new LayoutParams(h, w);
+ } else {
+ params = new LayoutParams(w, h);
+ }
+ params.setMargins(0, 0, 15, 15);
+ params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
+ params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
+ mVideoCaptureViewReady.setLayoutParams(params);
+ }
+
+ public void onConfigurationChanged(Configuration newConfig) {
+ resizePreview();
+ super.onConfigurationChanged(null);
+ }
+
+ private void resetControlsLayoutExpiration() {
+ if (mControls != null) {
+ controlsHandler.removeCallbacks(mControls);
+ }
+
+ controlsHandler.postDelayed(mControls = new Runnable() {
+ public void run() {
+ mControlsLayout.setVisibility(View.GONE);
+ }
+ }, DELAY_BEFORE_HIDING_CONTROLS);
+ }
+
+ public void onClick(View v) {
+ resetControlsLayoutExpiration();
+ switch (v.getId()) {
+ case R.id.incallHang:
+ terminateCurrentCallOrConferenceOrAll();
+ break;
+ case R.id.toggleSpeaker:
+ if (((Checkable) v).isChecked()) {
+ LinphoneManager.getInstance().routeAudioToSpeaker();
+ } else {
+ LinphoneManager.getInstance().routeAudioToReceiver();
+ }
+ break;
+ case R.id.incallNumpadShow:
+ showDialog(numpadDialogId);
+ break;
+ case R.id.toggleMuteMic:
+ LinphoneManager.getLc().muteMic(((Checkable) v).isChecked());
+ break;
+ case R.id.switch_camera:
+ int id = LinphoneManager.getLc().getVideoDevice();
+ id = (id + 1) % AndroidCameraConfiguration.retrieveCameras().length;
+ LinphoneManager.getLc().setVideoDevice(id);
+ CallManager.getInstance().updateCall();
+ // previous call will cause graph reconstruction -> regive preview
+ // window
+ if (mVideoCaptureViewReady != null)
+ LinphoneManager.getLc()
+ .setPreviewWindow(mVideoCaptureViewReady);
+ break;
+ case R.id.conf_simple_pause:
+ finish();
+ LinphoneActivity.instance().startIncallActivity();
+ LinphoneManager.getLc().pauseCall(videoCall);
+ break;
+ case R.id.conf_simple_video:
+ LinphoneCallParams params = videoCall.getCurrentParamsCopy();
+ params.setVideoEnabled(false);
+ LinphoneManager.getLc().updateCall(videoCall, params);
+ break;
+ case R.id.addCall:
+ finish();
+ break;
+ }
+ }
+
+ protected Dialog onCreateDialog(final int id) {
+ switch (id) {
+ case numpadDialogId:
+ Numpad numpad = new Numpad(this, true);
+ return new AlertDialog.Builder(this)
+ .setView(numpad)
+ .setPositiveButton(R.string.close_button_text,
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog,
+ int whichButton) {
+ dismissDialog(id);
+ }
+ }).create();
+ default:
+ throw new IllegalArgumentException("unkown dialog id " + id);
+ }
+ }
+
+ private void terminateCurrentCallOrConferenceOrAll() {
+ LinphoneCall currentCall = LinphoneManager.getLc().getCurrentCall();
+ if (currentCall != null) {
+ LinphoneManager.getLc().terminateCall(currentCall);
+ } else if (LinphoneManager.getLc().isInConference()) {
+ LinphoneManager.getLc().terminateConference();
+ } else {
+ LinphoneManager.getLc().terminateAllCalls();
+ }
+ finish();
+ }
}
diff --git a/src/org/linphone/core/LinphoneCoreFactoryImpl.java b/src/org/linphone/core/LinphoneCoreFactoryImpl.java
index a5ae7805f..29f1c58ca 100644
--- a/src/org/linphone/core/LinphoneCoreFactoryImpl.java
+++ b/src/org/linphone/core/LinphoneCoreFactoryImpl.java
@@ -20,9 +20,12 @@ package org.linphone.core;
import java.io.File;
import java.io.IOException;
+import java.io.InputStream;
import org.linphone.mediastream.Version;
+import android.util.Log;
+
public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory {
private static void loadOptionalLibrary(String s) {
@@ -35,10 +38,17 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory {
static {
// FFMPEG (audio/video)
- loadOptionalLibrary("avutil");
- loadOptionalLibrary("swscale");
- loadOptionalLibrary("avcore");
- loadOptionalLibrary("avcodec");
+ if (!hasNeonInCpuFeatures()) {
+ loadOptionalLibrary("avutilnoneon");
+ loadOptionalLibrary("swscalenoneon");
+ loadOptionalLibrary("avcorenoneon");
+ loadOptionalLibrary("avcodecnoneon");
+ } else {
+ loadOptionalLibrary("avutil");
+ loadOptionalLibrary("swscale");
+ loadOptionalLibrary("avcore");
+ loadOptionalLibrary("avcodec");
+ }
// OPENSSL (cryptography)
// lin prefix avoids collision with libs in /system/lib
@@ -56,7 +66,11 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory {
loadOptionalLibrary("bcg729");
//Main library
- System.loadLibrary("linphone");
+ if (!hasNeonInCpuFeatures()) {
+ System.loadLibrary("linphonenoneon");
+ } else {
+ System.loadLibrary("linphone");
+ }
Version.dumpCapabilities();
}
@@ -121,4 +135,30 @@ public class LinphoneCoreFactoryImpl extends LinphoneCoreFactory {
public LinphoneFriend createLinphoneFriend() {
return createLinphoneFriend(null);
}
+
+ public static boolean hasNeonInCpuFeatures()
+ {
+ ProcessBuilder cmd;
+ boolean result = false;
+
+ try {
+ String[] args = {"/system/bin/cat", "/proc/cpuinfo"};
+ cmd = new ProcessBuilder(args);
+
+ Process process = cmd.start();
+ InputStream in = process.getInputStream();
+ byte[] re = new byte[1024];
+ while(in.read(re) != -1){
+ String line = new String(re);
+ if (line.startsWith("Features")) {
+ result = line.contains("neon");
+ break;
+ }
+ }
+ in.close();
+ } catch(IOException ex){
+ ex.printStackTrace();
+ }
+ return result;
+ }
}
diff --git a/src/org/linphone/core/LinphoneCoreImpl.java b/src/org/linphone/core/LinphoneCoreImpl.java
index 597f647f3..0dd655fcd 100644
--- a/src/org/linphone/core/LinphoneCoreImpl.java
+++ b/src/org/linphone/core/LinphoneCoreImpl.java
@@ -20,8 +20,6 @@ package org.linphone.core;
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
import java.util.Vector;
diff --git a/src/org/linphone/ui/CameraView.java b/src/org/linphone/ui/CameraView.java
new file mode 100644
index 000000000..2f2f5b781
--- /dev/null
+++ b/src/org/linphone/ui/CameraView.java
@@ -0,0 +1,195 @@
+package org.linphone.ui;
+
+import java.io.IOException;
+import java.util.List;
+
+import android.content.Context;
+import android.hardware.Camera;
+import android.hardware.Camera.CameraInfo;
+import android.hardware.Camera.Size;
+import android.util.AttributeSet;
+import android.view.Display;
+import android.view.Surface;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+
+public class CameraView extends ViewGroup implements SurfaceHolder.Callback {
+
+ public CameraView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ mSurfaceView = new SurfaceView(context);
+ addView(mSurfaceView);
+
+ mHolder = mSurfaceView.getHolder();
+ mHolder.addCallback(this);
+ mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+ }
+
+ CameraView(Context context) {
+ super(context);
+
+ mSurfaceView = new SurfaceView(context);
+ addView(mSurfaceView);
+
+ mHolder = mSurfaceView.getHolder();
+ mHolder.addCallback(this);
+ mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+ }
+
+ SurfaceView mSurfaceView;
+ SurfaceHolder mHolder;
+ Size mPreviewSize;
+ List mSupportedSizes;
+ Camera mCamera;
+ int mCameraId;
+
+ public void setCamera(Camera camera, int id) {
+ mCamera = camera;
+ mCameraId = id;
+ if (mCamera != null) {
+ mSupportedSizes = mCamera.getParameters().getSupportedPreviewSizes();
+ requestLayout();
+ }
+ }
+
+ public void switchCamera(Camera camera, int id) {
+ setCamera(camera, id);
+ try {
+ camera.setPreviewDisplay(mHolder);
+ } catch (IOException exception) {
+
+ }
+ Camera.Parameters parameters = camera.getParameters();
+ parameters.setPreviewSize(mPreviewSize.width, mPreviewSize.height);
+ requestLayout();
+
+ camera.setParameters(parameters);
+ }
+
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ int width = resolveSize(getSuggestedMinimumWidth(), widthMeasureSpec);;
+ int height = resolveSize(getSuggestedMinimumHeight(), heightMeasureSpec);;
+ setMeasuredDimension(width, height);
+
+ if (mSupportedSizes != null) {
+ mPreviewSize = getOptimalPreviewSize(mSupportedSizes, width, height);
+ }
+
+ Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
+ if (display.getRotation() == Surface.ROTATION_90 || display.getRotation() == Surface.ROTATION_270) {
+ Size tempSize = mPreviewSize;
+ mPreviewSize.width = tempSize.height;
+ mPreviewSize.height = tempSize.width;
+ }
+ }
+
+ protected void onLayout(boolean changed, int l, int t, int r, int b) {
+ if (changed && getChildCount() > 0) {
+ final View child = getChildAt(0);
+
+ final int width = r - l;
+ final int height = b - t;
+
+ int previewWidth = width;
+ int previewHeight = height;
+ if (mPreviewSize != null) {
+ previewWidth = mPreviewSize.width;
+ previewHeight = mPreviewSize.height;
+ }
+
+ // Center the surface view
+ if (width * previewHeight > height * previewWidth) {
+ final int scaledChildWidth = previewWidth * height / previewHeight;
+ child.layout((width - scaledChildWidth) / 2, 0,
+ (width + scaledChildWidth) / 2, height);
+ } else {
+ final int scaledChildHeight = previewHeight * width / previewWidth;
+ child.layout(0, (height - scaledChildHeight) / 2,
+ width, (height + scaledChildHeight) / 2);
+ }
+ }
+ }
+
+ public void surfaceCreated(SurfaceHolder holder) {
+ try {
+ if (mCamera != null) {
+ mCamera.setPreviewDisplay(holder);
+ }
+ } catch (IOException exception) {
+
+ }
+ }
+
+ public void surfaceDestroyed(SurfaceHolder holder) {
+ if (mCamera != null) {
+ mCamera.stopPreview();
+ }
+ }
+
+ private Size getOptimalPreviewSize(List sizes, int w, int h) {
+ final double ASPECT_TOLERANCE = 0.1;
+ double targetRatio = (double) w / h;
+ if (sizes == null) return null;
+
+ Size optimalSize = null;
+ double minDiff = Double.MAX_VALUE;
+
+ int targetHeight = h;
+
+ for (Size size : sizes) {
+ double ratio = (double) size.width / size.height;
+ if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue;
+ if (Math.abs(size.height - targetHeight) < minDiff) {
+ optimalSize = size;
+ minDiff = Math.abs(size.height - targetHeight);
+ }
+ }
+
+ if (optimalSize == null) {
+ minDiff = Double.MAX_VALUE;
+ for (Size size : sizes) {
+ if (Math.abs(size.height - targetHeight) < minDiff) {
+ optimalSize = size;
+ minDiff = Math.abs(size.height - targetHeight);
+ }
+ }
+ }
+ return optimalSize;
+ }
+
+ public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
+ if (mCamera == null)
+ return;
+
+ mCamera.stopPreview();
+ Display display = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
+ Camera.Parameters parameters = mCamera.getParameters();
+
+ int rotation = 0;
+ if(display.getRotation() == Surface.ROTATION_90) {
+ rotation = 90;
+ }
+ else if(display.getRotation() == Surface.ROTATION_270) {
+ rotation = 270;
+ }
+ else if (display.getRotation() == Surface.ROTATION_180) {
+ rotation = 180;
+ }
+
+ CameraInfo cameraInfo = new CameraInfo();
+ Camera.getCameraInfo(mCameraId, cameraInfo);
+ if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
+ mCamera.setDisplayOrientation((cameraInfo.orientation - rotation + 360) % 360);
+ } else {
+ mCamera.setDisplayOrientation((cameraInfo.orientation + rotation) % 360);
+ }
+
+ requestLayout();
+ mCamera.setParameters(parameters);
+ mCamera.startPreview();
+ }
+}
\ No newline at end of file
diff --git a/submodules/externals/build/ffmpeg-no-neon/Android.mk b/submodules/externals/build/ffmpeg-no-neon/Android.mk
new file mode 100755
index 000000000..18ab5addd
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/Android.mk
@@ -0,0 +1,4 @@
+include $(linphone-root-dir)/submodules/externals/build/ffmpeg-no-neon/Android_libavutil.mk
+include $(linphone-root-dir)/submodules/externals/build/ffmpeg-no-neon/Android_libavcodec.mk
+include $(linphone-root-dir)/submodules/externals/build/ffmpeg-no-neon/Android_libswscale.mk
+include $(linphone-root-dir)/submodules/externals/build/ffmpeg-no-neon/Android_libavcore.mk
diff --git a/submodules/externals/build/ffmpeg-no-neon/Android_libavcodec.mk b/submodules/externals/build/ffmpeg-no-neon/Android_libavcodec.mk
new file mode 100755
index 000000000..987b79d1f
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/Android_libavcodec.mk
@@ -0,0 +1,109 @@
+LOCAL_PATH:= $(call my-dir)/../../ffmpeg
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libavcodecnoneon
+
+LOCAL_SRC_FILES = \
+ libavcodec/allcodecs.c \
+ libavcodec/aandcttab.c \
+ libavcodec/arm/dsputil_arm.S.arm \
+ libavcodec/arm/dsputil_armv6.S.arm \
+ libavcodec/arm/dsputil_init_arm.c \
+ libavcodec/arm/dsputil_init_armv5te.c \
+ libavcodec/arm/dsputil_init_armv6.c \
+ libavcodec/arm/dsputil_init_neon.c \
+ libavcodec/arm/dsputil_init_vfp.c \
+ libavcodec/arm/dsputil_neon.S.neon \
+ libavcodec/arm/dsputil_vfp.S.neon \
+ libavcodec/arm/fft_init_arm.c \
+ libavcodec/arm/fft_neon.S.neon \
+ libavcodec/arm/h264dsp_init_arm.c \
+ libavcodec/arm/h264dsp_neon.S.neon \
+ libavcodec/arm/h264idct_neon.S.neon \
+ libavcodec/arm/h264pred_init_arm.c \
+ libavcodec/arm/h264pred_neon.S.neon \
+ libavcodec/arm/int_neon.S.neon \
+ libavcodec/arm/jrevdct_arm.S \
+ libavcodec/arm/mdct_neon.S.neon \
+ libavcodec/arm/mpegvideo_arm.c \
+ libavcodec/arm/mpegvideo_armv5te.c \
+ libavcodec/arm/mpegvideo_armv5te_s.S \
+ libavcodec/arm/mpegvideo_neon.S.neon \
+ libavcodec/arm/simple_idct_arm.S \
+ libavcodec/arm/simple_idct_armv5te.S \
+ libavcodec/arm/simple_idct_armv6.S \
+ libavcodec/arm/simple_idct_neon.S.neon \
+ libavcodec/audioconvert.c.arm \
+ libavcodec/avpacket.c \
+ libavcodec/bitstream.c \
+ libavcodec/bitstream_filter.c \
+ libavcodec/cabac.c \
+ libavcodec/dsputil.c.arm \
+ libavcodec/error_resilience.c \
+ libavcodec/faandct.c \
+ libavcodec/faanidct.c \
+ libavcodec/flvdec.c \
+ libavcodec/flvenc.c \
+ libavcodec/fft.c \
+ libavcodec/golomb.c \
+ libavcodec/h263.c.arm \
+ libavcodec/h263_parser.c \
+ libavcodec/h263dec.c \
+ libavcodec/h264.c \
+ libavcodec/h264_cabac.c.arm \
+ libavcodec/h264_cavlc.c.arm \
+ libavcodec/h264_direct.c.arm \
+ libavcodec/h264_loopfilter.c \
+ libavcodec/h264_ps.c \
+ libavcodec/h264_refs.c \
+ libavcodec/h264_sei.c \
+ libavcodec/h264dsp.c \
+ libavcodec/h264idct.c \
+ libavcodec/h264pred.c \
+ libavcodec/imgconvert.c \
+ libavcodec/intelh263dec.c \
+ libavcodec/inverse.c \
+ libavcodec/ituh263dec.c \
+ libavcodec/ituh263enc.c \
+ libavcodec/jfdctfst.c \
+ libavcodec/jfdctint.c \
+ libavcodec/jrevdct.c \
+ libavcodec/mjpeg.c.arm \
+ libavcodec/mjpegdec.c.arm \
+ libavcodec/motion_est.c.arm \
+ libavcodec/mpeg12data.c \
+ libavcodec/mpeg4video.c.arm \
+ libavcodec/mpeg4video_parser.c \
+ libavcodec/mpeg4videodec.c.arm \
+ libavcodec/mpeg4videoenc.c.arm \
+ libavcodec/mpegvideo.c.arm \
+ libavcodec/mpegvideo_enc.c.arm \
+ libavcodec/opt.c \
+ libavcodec/options.c \
+ libavcodec/parser.c \
+ libavcodec/ratecontrol.c \
+ libavcodec/raw.c \
+ libavcodec/resample.c \
+ libavcodec/resample2.c \
+ libavcodec/simple_idct.c \
+ libavcodec/utils.c \
+ libavcodec/svq3.c \
+ libavcodec/pthread.c
+
+
+LOCAL_ARM_MODE := arm
+
+#LOCAL_CFLAGS += -DHAVE_AV_CONFIG_H -Wa,-I$(LOCAL_PATH)/libavcodec/arm
+LOCAL_CFLAGS += -DHAVE_AV_CONFIG_H
+
+#for including config.h:
+LOCAL_C_INCLUDES += \
+ $(LOCAL_PATH)/../build/ffmpeg-no-neon \
+ $(LOCAL_PATH)/libavcodec/arm \
+ $(LOCAL_PATH)/ \
+ $(LOCAL_PATH)/libavutil
+
+LOCAL_SHARED_LIBRARIES := libavutilnoneon libavcorenoneon
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/submodules/externals/build/ffmpeg-no-neon/Android_libavcore.mk b/submodules/externals/build/ffmpeg-no-neon/Android_libavcore.mk
new file mode 100644
index 000000000..6d71bca3f
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/Android_libavcore.mk
@@ -0,0 +1,27 @@
+
+LOCAL_PATH:= $(call my-dir)/../../ffmpeg/
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libavcorenoneon
+
+
+LOCAL_SRC_FILES := \
+ libavcore/imgutils.c \
+ libavcore/parseutils.c \
+ libavcore/utils.c
+
+# libavcore/samplefmt.c \
+# libavcore/audioconvert.c
+
+
+LOCAL_CFLAGS += -DHAVE_AV_CONFIG_H
+
+
+
+#for including config.h:
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../build/ffmpeg-no-neon $(LOCAL_PATH)/
+
+LOCAL_SHARED_LIBRARIES := libavutilnoneon
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/submodules/externals/build/ffmpeg-no-neon/Android_libavutil.mk b/submodules/externals/build/ffmpeg-no-neon/Android_libavutil.mk
new file mode 100755
index 000000000..85ad51558
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/Android_libavutil.mk
@@ -0,0 +1,45 @@
+
+LOCAL_PATH:= $(call my-dir)/../../ffmpeg/
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libavutilnoneon
+
+
+LOCAL_SRC_FILES = \
+ libavutil/adler32.c \
+ libavutil/aes.c \
+ libavutil/arm/cpu.c \
+ libavutil/avstring.c \
+ libavutil/base64.c \
+ libavutil/cpu.c \
+ libavutil/crc.c \
+ libavutil/des.c \
+ libavutil/error.c \
+ libavutil/eval.c \
+ libavutil/fifo.c \
+ libavutil/intfloat_readwrite.c \
+ libavutil/inverse.c \
+ libavutil/lfg.c \
+ libavutil/lls.c \
+ libavutil/log.c \
+ libavutil/lzo.c \
+ libavutil/mathematics.c \
+ libavutil/md5.c \
+ libavutil/mem.c \
+ libavutil/opt.c \
+ libavutil/pixdesc.c \
+ libavutil/random_seed.c \
+ libavutil/rational.c \
+ libavutil/rc4.c \
+ libavutil/sha.c \
+ libavutil/tree.c \
+ libavutil/utils.c
+
+LOCAL_CFLAGS += -DHAVE_AV_CONFIG_H
+
+LOCAL_ARM_MODE := arm
+
+#for including config.h:
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../build/ffmpeg-no-neon $(LOCAL_PATH)/
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/submodules/externals/build/ffmpeg-no-neon/Android_libswscale.mk b/submodules/externals/build/ffmpeg-no-neon/Android_libswscale.mk
new file mode 100755
index 000000000..21c5c7219
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/Android_libswscale.mk
@@ -0,0 +1,26 @@
+##lib swcale###################
+LOCAL_PATH:= $(call my-dir)/../../ffmpeg/libswscale/
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := libswscalenoneon
+
+LOCAL_SRC_FILES = \
+ options.c \
+ rgb2rgb.c \
+ swscale.c \
+ utils.c \
+ yuv2rgb.c
+
+LOCAL_CFLAGS += -DHAVE_AV_CONFIG_H
+
+LOCAL_ARM_MODE := arm
+
+#for including config.h:
+LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../build/ffmpeg-no-neon \
+ $(LOCAL_PATH)/ \
+ $(LOCAL_PATH)/../
+
+LOCAL_SHARED_LIBRARIES := libavutilnoneon
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/submodules/externals/build/ffmpeg-no-neon/README b/submodules/externals/build/ffmpeg-no-neon/README
new file mode 100644
index 000000000..77d16a1e2
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/README
@@ -0,0 +1,3 @@
+config.h and list of sources files generated by the following configure invocation:
+
+./configure --disable-mmx --prefix=/Users/jehanmonnier/opt --enable-cross-compile --arch=arm --target-os=linux --cc=arm-none-linux-gnueabi-gcc --disable-ffplay --disable-ffmpeg --disable-ffprobe --disable-ffserver --disable-avdevice --disable-avcore --disable-avfilter --disable-network --disable-everything --enable-decoder=mpeg4 --enable-encoder=mpeg4 --enable-decoder=h264 --enable-decoder=mjpeg --disable-avformat --enable-armv6 --enable-armv6t2 --enable-armvfp --enable-neon --enable-pic --extra-cflags='-fPIC -march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp -mfpu=neon'
diff --git a/submodules/externals/build/ffmpeg-no-neon/config.h b/submodules/externals/build/ffmpeg-no-neon/config.h
new file mode 100644
index 000000000..a564aa309
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/config.h
@@ -0,0 +1,956 @@
+/* Automatically generated by configure - do not modify! */
+#ifndef FFMPEG_CONFIG_H
+#define FFMPEG_CONFIG_H
+#define FFMPEG_CONFIGURATION "--disable-mmx --prefix=/Users/jehanmonnier/opt --enable-cross-compile --arch=arm --target-os=linux --cc=arm-none-linux-gnueabi-gcc --disable-ffplay --disable-ffmpeg --disable-ffprobe --disable-ffserver --disable-avdevice --disable-avcore --disable-avfilter --disable-network --disable-everything --enable-decoder=mpeg4 --enable-encoder=mpeg4 --enable-decoder=h264 --disable-avformat --enable-armv6 --enable-armv6t2 --enable-armvfp --disable-neon --enable-pic --extra-cflags='-fPIC -march=armv7-a -mcpu=cortex-a8 -mfloat-abi=softfp'"
+#define FFMPEG_LICENSE "LGPL version 2.1 or later"
+#define FFMPEG_DATADIR "/Users/jehanmonnier/opt/share/ffmpeg"
+#define CC_TYPE "gcc"
+#define CC_VERSION __VERSION__
+#define restrict
+#define ASMALIGN(ZEROBITS) ".p2align " #ZEROBITS "\n\t"
+#define EXTERN_PREFIX ""
+#define EXTERN_ASM
+#define ARCH_ALPHA 0
+#define ARCH_ARM 1
+#define ARCH_AVR32 0
+#define ARCH_AVR32_AP 0
+#define ARCH_AVR32_UC 0
+#define ARCH_BFIN 0
+#define ARCH_IA64 0
+#define ARCH_M68K 0
+#define ARCH_MIPS 0
+#define ARCH_MIPS64 0
+#define ARCH_PARISC 0
+#define ARCH_PPC 0
+#define ARCH_PPC64 0
+#define ARCH_S390 0
+#define ARCH_SH4 0
+#define ARCH_SPARC 0
+#define ARCH_SPARC64 0
+#define ARCH_TOMI 0
+#define ARCH_X86 0
+#define ARCH_X86_32 0
+#define ARCH_X86_64 0
+#define HAVE_ALTIVEC 0
+#define HAVE_AMD3DNOW 0
+#define HAVE_AMD3DNOWEXT 0
+#define HAVE_ARMV5TE 1
+#define HAVE_ARMV6 1
+#define HAVE_ARMV6T2 1
+#define HAVE_ARMVFP 1
+#define HAVE_IWMMXT 0
+#define HAVE_MMI 0
+#define HAVE_MMX 0
+#define HAVE_MMX2 0
+#define HAVE_NEON 0
+#define HAVE_PPC4XX 0
+#define HAVE_SSE 0
+#define HAVE_SSSE3 0
+#define HAVE_VIS 0
+#define HAVE_BIGENDIAN 0
+#define HAVE_FAST_UNALIGNED 1
+#define HAVE_PTHREADS 1
+#define HAVE_W32THREADS 0
+#define HAVE_ALIGNED_STACK 0
+#define HAVE_ALSA_ASOUNDLIB_H 0
+#define HAVE_ALTIVEC_H 0
+#define HAVE_ARPA_INET_H 0
+#define HAVE_ATTRIBUTE_MAY_ALIAS 1
+#define HAVE_ATTRIBUTE_PACKED 1
+#define HAVE_BSWAP 0
+#define HAVE_CLOSESOCKET 0
+#define HAVE_CMOV 0
+#define HAVE_CONIO_H 0
+#define HAVE_DCBZL 0
+#define HAVE_DEV_BKTR_IOCTL_BT848_H 0
+#define HAVE_DEV_BKTR_IOCTL_METEOR_H 0
+#define HAVE_DEV_IC_BT8XX_H 0
+#define HAVE_DEV_VIDEO_METEOR_IOCTL_METEOR_H 0
+#define HAVE_DEV_VIDEO_BKTR_IOCTL_BT848_H 0
+#define HAVE_DLFCN_H 1
+#define HAVE_DLOPEN 1
+#define HAVE_DOS_PATHS 0
+#define HAVE_EBP_AVAILABLE 0
+#define HAVE_EBX_AVAILABLE 0
+#define HAVE_EXP2 1
+#define HAVE_EXP2F 1
+#define HAVE_FAST_64BIT 0
+#define HAVE_FAST_CLZ 1
+#define HAVE_FAST_CMOV 0
+#define HAVE_FCNTL 1
+#define HAVE_FORK 1
+#define HAVE_GETADDRINFO 1
+#define HAVE_GETHRTIME 0
+#define HAVE_GETPROCESSMEMORYINFO 0
+#define HAVE_GETPROCESSTIMES 0
+#define HAVE_GETRUSAGE 1
+#define HAVE_GNU_AS 1
+#define HAVE_STRUCT_RUSAGE_RU_MAXRSS 1
+#define HAVE_IBM_ASM 0
+#define HAVE_INET_ATON 1
+#define HAVE_INLINE_ASM 1
+#define HAVE_ISATTY 1
+#define HAVE_LDBRX 0
+#define HAVE_LIBDC1394_1 0
+#define HAVE_LIBDC1394_2 0
+#define HAVE_LLRINT 1
+#define HAVE_LLRINTF 1
+#define HAVE_LOCAL_ALIGNED_16 0
+#define HAVE_LOCAL_ALIGNED_8 0
+#define HAVE_LOG2 1
+#define HAVE_LOG2F 1
+#define HAVE_LOONGSON 0
+#define HAVE_LRINT 1
+#define HAVE_LRINTF 1
+#define HAVE_LZO1X_999_COMPRESS 0
+#define HAVE_MACHINE_IOCTL_BT848_H 0
+#define HAVE_MACHINE_IOCTL_METEOR_H 0
+#define HAVE_MALLOC_H 1
+#define HAVE_MEMALIGN 1
+#define HAVE_MKSTEMP 1
+#define HAVE_PLD 1
+#define HAVE_POSIX_MEMALIGN 0
+#define HAVE_ROUND 1
+#define HAVE_ROUNDF 1
+#define HAVE_SDL 0
+#define HAVE_SDL_VIDEO_SIZE 0
+#define HAVE_SETMODE 0
+#define HAVE_SOCKLEN_T 0
+#define HAVE_SOUNDCARD_H 0
+#define HAVE_POLL_H 1
+#define HAVE_SETRLIMIT 1
+#define HAVE_STRERROR_R 1
+#define HAVE_STRTOK_R 1
+#define HAVE_STRUCT_ADDRINFO 0
+#define HAVE_STRUCT_IPV6_MREQ 0
+#define HAVE_STRUCT_SOCKADDR_IN6 0
+#define HAVE_STRUCT_SOCKADDR_SA_LEN 0
+#define HAVE_STRUCT_SOCKADDR_STORAGE 0
+#define HAVE_SYMVER 1
+#define HAVE_SYMVER_GNU_ASM 1
+#define HAVE_SYMVER_ASM_LABEL 0
+#define HAVE_SYS_MMAN_H 1
+#define HAVE_SYS_RESOURCE_H 1
+#define HAVE_SYS_SELECT_H 1
+#define HAVE_SYS_SOUNDCARD_H 1
+#define HAVE_SYS_VIDEOIO_H 0
+#define HAVE_TEN_OPERANDS 0
+#define HAVE_TERMIOS_H 1
+#define HAVE_THREADS 1
+#define HAVE_TRUNCF 1
+#define HAVE_VFP_ARGS 0
+#define HAVE_VIRTUALALLOC 0
+#define HAVE_WINSOCK2_H 0
+#define HAVE_XFORM_ASM 0
+#define HAVE_YASM 0
+#define CONFIG_BSFS 0
+#define CONFIG_DECODERS 1
+#define CONFIG_DEMUXERS 0
+#define CONFIG_ENCODERS 1
+#define CONFIG_FILTERS 0
+#define CONFIG_HWACCELS 0
+#define CONFIG_INDEVS 0
+#define CONFIG_MUXERS 0
+#define CONFIG_OUTDEVS 0
+#define CONFIG_PARSERS 1
+#define CONFIG_PROTOCOLS 1
+#define CONFIG_AANDCT 1
+#define CONFIG_AVCODEC 1
+#define CONFIG_AVCORE 0
+#define CONFIG_AVDEVICE 0
+#define CONFIG_AVFILTER 0
+#define CONFIG_AVFORMAT 0
+#define CONFIG_AVISYNTH 0
+#define CONFIG_BZLIB 0
+#define CONFIG_DCT 0
+#define CONFIG_DOC 0
+#define CONFIG_DWT 0
+#define CONFIG_DXVA2 0
+#define CONFIG_FASTDIV 1
+#define CONFIG_FFMPEG 0
+#define CONFIG_FFPLAY 0
+#define CONFIG_FFPROBE 0
+#define CONFIG_FFSERVER 0
+#define CONFIG_FFT 0
+#define CONFIG_FREI0R 0
+#define CONFIG_GOLOMB 1
+#define CONFIG_GPL 0
+#define CONFIG_GRAY 0
+#define CONFIG_H264DSP 1
+#define CONFIG_H264PRED 1
+#define CONFIG_HARDCODED_TABLES 0
+#define CONFIG_HUFFMAN 0
+#define CONFIG_LIBDC1394 0
+#define CONFIG_LIBDIRAC 0
+#define CONFIG_LIBFAAC 0
+#define CONFIG_LIBGSM 0
+#define CONFIG_LIBMP3LAME 0
+#define CONFIG_LIBNUT 0
+#define CONFIG_LIBOPENCORE_AMRNB 0
+#define CONFIG_LIBOPENCORE_AMRWB 0
+#define CONFIG_LIBOPENCV 0
+#define CONFIG_LIBOPENJPEG 0
+#define CONFIG_LIBRTMP 0
+#define CONFIG_LIBSCHROEDINGER 0
+#define CONFIG_LIBSPEEX 0
+#define CONFIG_LIBTHEORA 0
+#define CONFIG_LIBVORBIS 0
+#define CONFIG_LIBVPX 0
+#define CONFIG_LIBX264 0
+#define CONFIG_LIBXAVS 0
+#define CONFIG_LIBXVID 0
+#define CONFIG_LPC 0
+#define CONFIG_LSP 0
+#define CONFIG_MDCT 0
+#define CONFIG_MEMALIGN_HACK 0
+#define CONFIG_MLIB 0
+#define CONFIG_MPEGAUDIO_HP 1
+#define CONFIG_NETWORK 0
+#define CONFIG_NONFREE 0
+#define CONFIG_PIC 1
+#define CONFIG_POSTPROC 0
+#define CONFIG_RDFT 0
+#define CONFIG_RUNTIME_CPUDETECT 0
+#define CONFIG_SHARED 0
+#define CONFIG_SMALL 0
+#define CONFIG_SRAM 0
+#define CONFIG_STATIC 1
+#define CONFIG_SWSCALE 1
+#define CONFIG_SWSCALE_ALPHA 1
+#define CONFIG_VAAPI 0
+#define CONFIG_VDPAU 0
+#define CONFIG_VERSION3 0
+#define CONFIG_X11GRAB 0
+#define CONFIG_ZLIB 0
+#define CONFIG_AVUTIL 1
+#define CONFIG_GPLV3 0
+#define CONFIG_LGPLV3 0
+#define CONFIG_AASC_DECODER 0
+#define CONFIG_AMV_DECODER 0
+#define CONFIG_ANM_DECODER 0
+#define CONFIG_ANSI_DECODER 0
+#define CONFIG_ASV1_DECODER 0
+#define CONFIG_ASV2_DECODER 0
+#define CONFIG_AURA_DECODER 0
+#define CONFIG_AURA2_DECODER 0
+#define CONFIG_AVS_DECODER 0
+#define CONFIG_BETHSOFTVID_DECODER 0
+#define CONFIG_BFI_DECODER 0
+#define CONFIG_BINK_DECODER 0
+#define CONFIG_BMP_DECODER 0
+#define CONFIG_C93_DECODER 0
+#define CONFIG_CAVS_DECODER 0
+#define CONFIG_CDGRAPHICS_DECODER 0
+#define CONFIG_CINEPAK_DECODER 0
+#define CONFIG_CLJR_DECODER 0
+#define CONFIG_CSCD_DECODER 0
+#define CONFIG_CYUV_DECODER 0
+#define CONFIG_DNXHD_DECODER 0
+#define CONFIG_DPX_DECODER 0
+#define CONFIG_DSICINVIDEO_DECODER 0
+#define CONFIG_DVVIDEO_DECODER 0
+#define CONFIG_DXA_DECODER 0
+#define CONFIG_EACMV_DECODER 0
+#define CONFIG_EAMAD_DECODER 0
+#define CONFIG_EATGQ_DECODER 0
+#define CONFIG_EATGV_DECODER 0
+#define CONFIG_EATQI_DECODER 0
+#define CONFIG_EIGHTBPS_DECODER 0
+#define CONFIG_EIGHTSVX_EXP_DECODER 0
+#define CONFIG_EIGHTSVX_FIB_DECODER 0
+#define CONFIG_ESCAPE124_DECODER 0
+#define CONFIG_FFV1_DECODER 0
+#define CONFIG_FFVHUFF_DECODER 0
+#define CONFIG_FLASHSV_DECODER 0
+#define CONFIG_FLIC_DECODER 0
+#define CONFIG_FLV_DECODER 0
+#define CONFIG_FOURXM_DECODER 0
+#define CONFIG_FRAPS_DECODER 0
+#define CONFIG_FRWU_DECODER 0
+#define CONFIG_GIF_DECODER 0
+#define CONFIG_H261_DECODER 0
+#define CONFIG_H263_DECODER 1
+#define CONFIG_H263I_DECODER 0
+#define CONFIG_H264_DECODER 1
+#define CONFIG_H264_VDPAU_DECODER 0
+#define CONFIG_HUFFYUV_DECODER 0
+#define CONFIG_IDCIN_DECODER 0
+#define CONFIG_IFF_BYTERUN1_DECODER 0
+#define CONFIG_IFF_ILBM_DECODER 0
+#define CONFIG_INDEO2_DECODER 0
+#define CONFIG_INDEO3_DECODER 0
+#define CONFIG_INDEO5_DECODER 0
+#define CONFIG_INTERPLAY_VIDEO_DECODER 0
+#define CONFIG_JPEGLS_DECODER 0
+#define CONFIG_KGV1_DECODER 0
+#define CONFIG_KMVC_DECODER 0
+#define CONFIG_LOCO_DECODER 0
+#define CONFIG_MDEC_DECODER 0
+#define CONFIG_MIMIC_DECODER 0
+#define CONFIG_MJPEG_DECODER 1
+#define CONFIG_MJPEGB_DECODER 0
+#define CONFIG_MMVIDEO_DECODER 0
+#define CONFIG_MOTIONPIXELS_DECODER 0
+#define CONFIG_MPEG_XVMC_DECODER 0
+#define CONFIG_MPEG1VIDEO_DECODER 0
+#define CONFIG_MPEG2VIDEO_DECODER 0
+#define CONFIG_MPEG4_DECODER 1
+#define CONFIG_MPEG4_VDPAU_DECODER 0
+#define CONFIG_MPEGVIDEO_DECODER 0
+#define CONFIG_MPEG_VDPAU_DECODER 0
+#define CONFIG_MPEG1_VDPAU_DECODER 0
+#define CONFIG_MSMPEG4V1_DECODER 0
+#define CONFIG_MSMPEG4V2_DECODER 0
+#define CONFIG_MSMPEG4V3_DECODER 0
+#define CONFIG_MSRLE_DECODER 0
+#define CONFIG_MSVIDEO1_DECODER 0
+#define CONFIG_MSZH_DECODER 0
+#define CONFIG_NUV_DECODER 0
+#define CONFIG_PAM_DECODER 0
+#define CONFIG_PBM_DECODER 0
+#define CONFIG_PCX_DECODER 0
+#define CONFIG_PGM_DECODER 0
+#define CONFIG_PGMYUV_DECODER 0
+#define CONFIG_PICTOR_DECODER 0
+#define CONFIG_PNG_DECODER 0
+#define CONFIG_PPM_DECODER 0
+#define CONFIG_PTX_DECODER 0
+#define CONFIG_QDRAW_DECODER 0
+#define CONFIG_QPEG_DECODER 0
+#define CONFIG_QTRLE_DECODER 0
+#define CONFIG_R10K_DECODER 0
+#define CONFIG_R210_DECODER 0
+#define CONFIG_RAWVIDEO_DECODER 0
+#define CONFIG_RL2_DECODER 0
+#define CONFIG_ROQ_DECODER 0
+#define CONFIG_RPZA_DECODER 0
+#define CONFIG_RV10_DECODER 0
+#define CONFIG_RV20_DECODER 0
+#define CONFIG_RV30_DECODER 0
+#define CONFIG_RV40_DECODER 0
+#define CONFIG_SGI_DECODER 0
+#define CONFIG_SMACKER_DECODER 0
+#define CONFIG_SMC_DECODER 0
+#define CONFIG_SNOW_DECODER 0
+#define CONFIG_SP5X_DECODER 0
+#define CONFIG_SUNRAST_DECODER 0
+#define CONFIG_SVQ1_DECODER 0
+#define CONFIG_SVQ3_DECODER 0
+#define CONFIG_TARGA_DECODER 0
+#define CONFIG_THEORA_DECODER 0
+#define CONFIG_THP_DECODER 0
+#define CONFIG_TIERTEXSEQVIDEO_DECODER 0
+#define CONFIG_TIFF_DECODER 0
+#define CONFIG_TMV_DECODER 0
+#define CONFIG_TRUEMOTION1_DECODER 0
+#define CONFIG_TRUEMOTION2_DECODER 0
+#define CONFIG_TSCC_DECODER 0
+#define CONFIG_TXD_DECODER 0
+#define CONFIG_ULTI_DECODER 0
+#define CONFIG_V210_DECODER 0
+#define CONFIG_V210X_DECODER 0
+#define CONFIG_VB_DECODER 0
+#define CONFIG_VC1_DECODER 0
+#define CONFIG_VC1_VDPAU_DECODER 0
+#define CONFIG_VCR1_DECODER 0
+#define CONFIG_VMDVIDEO_DECODER 0
+#define CONFIG_VMNC_DECODER 0
+#define CONFIG_VP3_DECODER 0
+#define CONFIG_VP5_DECODER 0
+#define CONFIG_VP6_DECODER 0
+#define CONFIG_VP6A_DECODER 0
+#define CONFIG_VP6F_DECODER 0
+#define CONFIG_VP8_DECODER 0
+#define CONFIG_VQA_DECODER 0
+#define CONFIG_WMV1_DECODER 0
+#define CONFIG_WMV2_DECODER 0
+#define CONFIG_WMV3_DECODER 0
+#define CONFIG_WMV3_VDPAU_DECODER 0
+#define CONFIG_WNV1_DECODER 0
+#define CONFIG_XAN_WC3_DECODER 0
+#define CONFIG_XL_DECODER 0
+#define CONFIG_YOP_DECODER 0
+#define CONFIG_ZLIB_DECODER 0
+#define CONFIG_ZMBV_DECODER 0
+#define CONFIG_AAC_DECODER 0
+#define CONFIG_AC3_DECODER 0
+#define CONFIG_ALAC_DECODER 0
+#define CONFIG_ALS_DECODER 0
+#define CONFIG_AMRNB_DECODER 0
+#define CONFIG_APE_DECODER 0
+#define CONFIG_ATRAC1_DECODER 0
+#define CONFIG_ATRAC3_DECODER 0
+#define CONFIG_BINKAUDIO_DCT_DECODER 0
+#define CONFIG_BINKAUDIO_RDFT_DECODER 0
+#define CONFIG_COOK_DECODER 0
+#define CONFIG_DCA_DECODER 0
+#define CONFIG_DSICINAUDIO_DECODER 0
+#define CONFIG_EAC3_DECODER 0
+#define CONFIG_FLAC_DECODER 0
+#define CONFIG_GSM_DECODER 0
+#define CONFIG_GSM_MS_DECODER 0
+#define CONFIG_IMC_DECODER 0
+#define CONFIG_MACE3_DECODER 0
+#define CONFIG_MACE6_DECODER 0
+#define CONFIG_MLP_DECODER 0
+#define CONFIG_MP1_DECODER 0
+#define CONFIG_MP1FLOAT_DECODER 0
+#define CONFIG_MP2_DECODER 0
+#define CONFIG_MP2FLOAT_DECODER 0
+#define CONFIG_MP3_DECODER 0
+#define CONFIG_MP3FLOAT_DECODER 0
+#define CONFIG_MP3ADU_DECODER 0
+#define CONFIG_MP3ADUFLOAT_DECODER 0
+#define CONFIG_MP3ON4_DECODER 0
+#define CONFIG_MP3ON4FLOAT_DECODER 0
+#define CONFIG_MPC7_DECODER 0
+#define CONFIG_MPC8_DECODER 0
+#define CONFIG_NELLYMOSER_DECODER 0
+#define CONFIG_QCELP_DECODER 0
+#define CONFIG_QDM2_DECODER 0
+#define CONFIG_RA_144_DECODER 0
+#define CONFIG_RA_288_DECODER 0
+#define CONFIG_SHORTEN_DECODER 0
+#define CONFIG_SIPR_DECODER 0
+#define CONFIG_SMACKAUD_DECODER 0
+#define CONFIG_SONIC_DECODER 0
+#define CONFIG_TRUEHD_DECODER 0
+#define CONFIG_TRUESPEECH_DECODER 0
+#define CONFIG_TTA_DECODER 0
+#define CONFIG_TWINVQ_DECODER 0
+#define CONFIG_VMDAUDIO_DECODER 0
+#define CONFIG_VORBIS_DECODER 0
+#define CONFIG_WAVPACK_DECODER 0
+#define CONFIG_WMAPRO_DECODER 0
+#define CONFIG_WMAV1_DECODER 0
+#define CONFIG_WMAV2_DECODER 0
+#define CONFIG_WMAVOICE_DECODER 0
+#define CONFIG_WS_SND1_DECODER 0
+#define CONFIG_PCM_ALAW_DECODER 0
+#define CONFIG_PCM_BLURAY_DECODER 0
+#define CONFIG_PCM_DVD_DECODER 0
+#define CONFIG_PCM_F32BE_DECODER 0
+#define CONFIG_PCM_F32LE_DECODER 0
+#define CONFIG_PCM_F64BE_DECODER 0
+#define CONFIG_PCM_F64LE_DECODER 0
+#define CONFIG_PCM_MULAW_DECODER 0
+#define CONFIG_PCM_S8_DECODER 0
+#define CONFIG_PCM_S16BE_DECODER 0
+#define CONFIG_PCM_S16LE_DECODER 0
+#define CONFIG_PCM_S16LE_PLANAR_DECODER 0
+#define CONFIG_PCM_S24BE_DECODER 0
+#define CONFIG_PCM_S24DAUD_DECODER 0
+#define CONFIG_PCM_S24LE_DECODER 0
+#define CONFIG_PCM_S32BE_DECODER 0
+#define CONFIG_PCM_S32LE_DECODER 0
+#define CONFIG_PCM_U8_DECODER 0
+#define CONFIG_PCM_U16BE_DECODER 0
+#define CONFIG_PCM_U16LE_DECODER 0
+#define CONFIG_PCM_U24BE_DECODER 0
+#define CONFIG_PCM_U24LE_DECODER 0
+#define CONFIG_PCM_U32BE_DECODER 0
+#define CONFIG_PCM_U32LE_DECODER 0
+#define CONFIG_PCM_ZORK_DECODER 0
+#define CONFIG_INTERPLAY_DPCM_DECODER 0
+#define CONFIG_ROQ_DPCM_DECODER 0
+#define CONFIG_SOL_DPCM_DECODER 0
+#define CONFIG_XAN_DPCM_DECODER 0
+#define CONFIG_ADPCM_4XM_DECODER 0
+#define CONFIG_ADPCM_ADX_DECODER 0
+#define CONFIG_ADPCM_CT_DECODER 0
+#define CONFIG_ADPCM_EA_DECODER 0
+#define CONFIG_ADPCM_EA_MAXIS_XA_DECODER 0
+#define CONFIG_ADPCM_EA_R1_DECODER 0
+#define CONFIG_ADPCM_EA_R2_DECODER 0
+#define CONFIG_ADPCM_EA_R3_DECODER 0
+#define CONFIG_ADPCM_EA_XAS_DECODER 0
+#define CONFIG_ADPCM_G722_DECODER 0
+#define CONFIG_ADPCM_G726_DECODER 0
+#define CONFIG_ADPCM_IMA_AMV_DECODER 0
+#define CONFIG_ADPCM_IMA_DK3_DECODER 0
+#define CONFIG_ADPCM_IMA_DK4_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_EACS_DECODER 0
+#define CONFIG_ADPCM_IMA_EA_SEAD_DECODER 0
+#define CONFIG_ADPCM_IMA_ISS_DECODER 0
+#define CONFIG_ADPCM_IMA_QT_DECODER 0
+#define CONFIG_ADPCM_IMA_SMJPEG_DECODER 0
+#define CONFIG_ADPCM_IMA_WAV_DECODER 0
+#define CONFIG_ADPCM_IMA_WS_DECODER 0
+#define CONFIG_ADPCM_MS_DECODER 0
+#define CONFIG_ADPCM_SBPRO_2_DECODER 0
+#define CONFIG_ADPCM_SBPRO_3_DECODER 0
+#define CONFIG_ADPCM_SBPRO_4_DECODER 0
+#define CONFIG_ADPCM_SWF_DECODER 0
+#define CONFIG_ADPCM_THP_DECODER 0
+#define CONFIG_ADPCM_XA_DECODER 0
+#define CONFIG_ADPCM_YAMAHA_DECODER 0
+#define CONFIG_DVBSUB_DECODER 0
+#define CONFIG_DVDSUB_DECODER 0
+#define CONFIG_PGSSUB_DECODER 0
+#define CONFIG_XSUB_DECODER 0
+#define CONFIG_LIBDIRAC_DECODER 0
+#define CONFIG_LIBGSM_DECODER 0
+#define CONFIG_LIBGSM_MS_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_DECODER 0
+#define CONFIG_LIBOPENCORE_AMRWB_DECODER 0
+#define CONFIG_LIBOPENJPEG_DECODER 0
+#define CONFIG_LIBSCHROEDINGER_DECODER 0
+#define CONFIG_LIBSPEEX_DECODER 0
+#define CONFIG_LIBVPX_DECODER 0
+#define CONFIG_A64MULTI_ENCODER 0
+#define CONFIG_A64MULTI5_ENCODER 0
+#define CONFIG_ASV1_ENCODER 0
+#define CONFIG_ASV2_ENCODER 0
+#define CONFIG_BMP_ENCODER 0
+#define CONFIG_DNXHD_ENCODER 0
+#define CONFIG_DVVIDEO_ENCODER 0
+#define CONFIG_FFV1_ENCODER 0
+#define CONFIG_FFVHUFF_ENCODER 0
+#define CONFIG_FLASHSV_ENCODER 0
+#define CONFIG_FLV_ENCODER 0
+#define CONFIG_GIF_ENCODER 0
+#define CONFIG_H261_ENCODER 0
+#define CONFIG_H263_ENCODER 1
+#define CONFIG_H263P_ENCODER 0
+#define CONFIG_HUFFYUV_ENCODER 0
+#define CONFIG_JPEGLS_ENCODER 0
+#define CONFIG_LJPEG_ENCODER 0
+#define CONFIG_MJPEG_ENCODER 0
+#define CONFIG_MPEG1VIDEO_ENCODER 0
+#define CONFIG_MPEG2VIDEO_ENCODER 0
+#define CONFIG_MPEG4_ENCODER 1
+#define CONFIG_MSMPEG4V1_ENCODER 0
+#define CONFIG_MSMPEG4V2_ENCODER 0
+#define CONFIG_MSMPEG4V3_ENCODER 0
+#define CONFIG_PAM_ENCODER 0
+#define CONFIG_PBM_ENCODER 0
+#define CONFIG_PCX_ENCODER 0
+#define CONFIG_PGM_ENCODER 0
+#define CONFIG_PGMYUV_ENCODER 0
+#define CONFIG_PNG_ENCODER 0
+#define CONFIG_PPM_ENCODER 0
+#define CONFIG_QTRLE_ENCODER 0
+#define CONFIG_RAWVIDEO_ENCODER 0
+#define CONFIG_ROQ_ENCODER 0
+#define CONFIG_RV10_ENCODER 0
+#define CONFIG_RV20_ENCODER 0
+#define CONFIG_SGI_ENCODER 0
+#define CONFIG_SNOW_ENCODER 0
+#define CONFIG_SVQ1_ENCODER 0
+#define CONFIG_TARGA_ENCODER 0
+#define CONFIG_TIFF_ENCODER 0
+#define CONFIG_V210_ENCODER 0
+#define CONFIG_WMV1_ENCODER 0
+#define CONFIG_WMV2_ENCODER 0
+#define CONFIG_ZLIB_ENCODER 0
+#define CONFIG_ZMBV_ENCODER 0
+#define CONFIG_AAC_ENCODER 0
+#define CONFIG_AC3_ENCODER 0
+#define CONFIG_ALAC_ENCODER 0
+#define CONFIG_FLAC_ENCODER 0
+#define CONFIG_MP2_ENCODER 0
+#define CONFIG_NELLYMOSER_ENCODER 0
+#define CONFIG_RA_144_ENCODER 0
+#define CONFIG_SONIC_ENCODER 0
+#define CONFIG_SONIC_LS_ENCODER 0
+#define CONFIG_VORBIS_ENCODER 0
+#define CONFIG_WMAV1_ENCODER 0
+#define CONFIG_WMAV2_ENCODER 0
+#define CONFIG_PCM_ALAW_ENCODER 0
+#define CONFIG_PCM_F32BE_ENCODER 0
+#define CONFIG_PCM_F32LE_ENCODER 0
+#define CONFIG_PCM_F64BE_ENCODER 0
+#define CONFIG_PCM_F64LE_ENCODER 0
+#define CONFIG_PCM_MULAW_ENCODER 0
+#define CONFIG_PCM_S8_ENCODER 0
+#define CONFIG_PCM_S16BE_ENCODER 0
+#define CONFIG_PCM_S16LE_ENCODER 0
+#define CONFIG_PCM_S24BE_ENCODER 0
+#define CONFIG_PCM_S24DAUD_ENCODER 0
+#define CONFIG_PCM_S24LE_ENCODER 0
+#define CONFIG_PCM_S32BE_ENCODER 0
+#define CONFIG_PCM_S32LE_ENCODER 0
+#define CONFIG_PCM_U8_ENCODER 0
+#define CONFIG_PCM_U16BE_ENCODER 0
+#define CONFIG_PCM_U16LE_ENCODER 0
+#define CONFIG_PCM_U24BE_ENCODER 0
+#define CONFIG_PCM_U24LE_ENCODER 0
+#define CONFIG_PCM_U32BE_ENCODER 0
+#define CONFIG_PCM_U32LE_ENCODER 0
+#define CONFIG_PCM_ZORK_ENCODER 0
+#define CONFIG_ROQ_DPCM_ENCODER 0
+#define CONFIG_ADPCM_ADX_ENCODER 0
+#define CONFIG_ADPCM_G722_ENCODER 0
+#define CONFIG_ADPCM_G726_ENCODER 0
+#define CONFIG_ADPCM_IMA_QT_ENCODER 0
+#define CONFIG_ADPCM_IMA_WAV_ENCODER 0
+#define CONFIG_ADPCM_MS_ENCODER 0
+#define CONFIG_ADPCM_SWF_ENCODER 0
+#define CONFIG_ADPCM_YAMAHA_ENCODER 0
+#define CONFIG_DVBSUB_ENCODER 0
+#define CONFIG_DVDSUB_ENCODER 0
+#define CONFIG_XSUB_ENCODER 0
+#define CONFIG_LIBDIRAC_ENCODER 0
+#define CONFIG_LIBFAAC_ENCODER 0
+#define CONFIG_LIBGSM_ENCODER 0
+#define CONFIG_LIBGSM_MS_ENCODER 0
+#define CONFIG_LIBMP3LAME_ENCODER 0
+#define CONFIG_LIBOPENCORE_AMRNB_ENCODER 0
+#define CONFIG_LIBSCHROEDINGER_ENCODER 0
+#define CONFIG_LIBTHEORA_ENCODER 0
+#define CONFIG_LIBVORBIS_ENCODER 0
+#define CONFIG_LIBVPX_ENCODER 0
+#define CONFIG_LIBX264_ENCODER 0
+#define CONFIG_LIBXAVS_ENCODER 0
+#define CONFIG_LIBXVID_ENCODER 0
+#define CONFIG_H263_VAAPI_HWACCEL 0
+#define CONFIG_H264_DXVA2_HWACCEL 0
+#define CONFIG_H264_VAAPI_HWACCEL 0
+#define CONFIG_MPEG2_DXVA2_HWACCEL 0
+#define CONFIG_MPEG2_VAAPI_HWACCEL 0
+#define CONFIG_MPEG4_VAAPI_HWACCEL 0
+#define CONFIG_VC1_DXVA2_HWACCEL 0
+#define CONFIG_VC1_VAAPI_HWACCEL 0
+#define CONFIG_WMV3_DXVA2_HWACCEL 0
+#define CONFIG_WMV3_VAAPI_HWACCEL 0
+#define CONFIG_AAC_PARSER 0
+#define CONFIG_AC3_PARSER 0
+#define CONFIG_CAVSVIDEO_PARSER 0
+#define CONFIG_DCA_PARSER 0
+#define CONFIG_DIRAC_PARSER 0
+#define CONFIG_DNXHD_PARSER 0
+#define CONFIG_DVBSUB_PARSER 0
+#define CONFIG_DVDSUB_PARSER 0
+#define CONFIG_H261_PARSER 0
+#define CONFIG_H263_PARSER 1
+#define CONFIG_H264_PARSER 0
+#define CONFIG_MJPEG_PARSER 0
+#define CONFIG_MLP_PARSER 0
+#define CONFIG_MPEG4VIDEO_PARSER 1
+#define CONFIG_MPEGAUDIO_PARSER 0
+#define CONFIG_MPEGVIDEO_PARSER 0
+#define CONFIG_PNM_PARSER 0
+#define CONFIG_VC1_PARSER 0
+#define CONFIG_VP3_PARSER 0
+#define CONFIG_VP8_PARSER 0
+#define CONFIG_AAC_ADTSTOASC_BSF 0
+#define CONFIG_CHOMP_BSF 0
+#define CONFIG_DUMP_EXTRADATA_BSF 0
+#define CONFIG_H264_MP4TOANNEXB_BSF 0
+#define CONFIG_IMX_DUMP_HEADER_BSF 0
+#define CONFIG_MJPEGA_DUMP_HEADER_BSF 0
+#define CONFIG_MP3_HEADER_COMPRESS_BSF 0
+#define CONFIG_MP3_HEADER_DECOMPRESS_BSF 0
+#define CONFIG_MOV2TEXTSUB_BSF 0
+#define CONFIG_NOISE_BSF 0
+#define CONFIG_REMOVE_EXTRADATA_BSF 0
+#define CONFIG_TEXT2MOVSUB_BSF 0
+#define CONFIG_AAC_DEMUXER 0
+#define CONFIG_AC3_DEMUXER 0
+#define CONFIG_AEA_DEMUXER 0
+#define CONFIG_AIFF_DEMUXER 0
+#define CONFIG_AMR_DEMUXER 0
+#define CONFIG_ANM_DEMUXER 0
+#define CONFIG_APC_DEMUXER 0
+#define CONFIG_APE_DEMUXER 0
+#define CONFIG_APPLEHTTP_DEMUXER 0
+#define CONFIG_ASF_DEMUXER 0
+#define CONFIG_ASS_DEMUXER 0
+#define CONFIG_AU_DEMUXER 0
+#define CONFIG_AVI_DEMUXER 0
+#define CONFIG_AVISYNTH_DEMUXER 0
+#define CONFIG_AVS_DEMUXER 0
+#define CONFIG_BETHSOFTVID_DEMUXER 0
+#define CONFIG_BFI_DEMUXER 0
+#define CONFIG_BINK_DEMUXER 0
+#define CONFIG_C93_DEMUXER 0
+#define CONFIG_CAF_DEMUXER 0
+#define CONFIG_CAVSVIDEO_DEMUXER 0
+#define CONFIG_CDG_DEMUXER 0
+#define CONFIG_DAUD_DEMUXER 0
+#define CONFIG_DIRAC_DEMUXER 0
+#define CONFIG_DNXHD_DEMUXER 0
+#define CONFIG_DSICIN_DEMUXER 0
+#define CONFIG_DTS_DEMUXER 0
+#define CONFIG_DV_DEMUXER 0
+#define CONFIG_DXA_DEMUXER 0
+#define CONFIG_EA_DEMUXER 0
+#define CONFIG_EA_CDATA_DEMUXER 0
+#define CONFIG_EAC3_DEMUXER 0
+#define CONFIG_FFM_DEMUXER 0
+#define CONFIG_FILMSTRIP_DEMUXER 0
+#define CONFIG_FLAC_DEMUXER 0
+#define CONFIG_FLIC_DEMUXER 0
+#define CONFIG_FLV_DEMUXER 0
+#define CONFIG_FOURXM_DEMUXER 0
+#define CONFIG_G722_DEMUXER 0
+#define CONFIG_GSM_DEMUXER 0
+#define CONFIG_GXF_DEMUXER 0
+#define CONFIG_H261_DEMUXER 0
+#define CONFIG_H263_DEMUXER 0
+#define CONFIG_H264_DEMUXER 0
+#define CONFIG_IDCIN_DEMUXER 0
+#define CONFIG_IFF_DEMUXER 0
+#define CONFIG_IMAGE2_DEMUXER 0
+#define CONFIG_IMAGE2PIPE_DEMUXER 0
+#define CONFIG_INGENIENT_DEMUXER 0
+#define CONFIG_IPMOVIE_DEMUXER 0
+#define CONFIG_ISS_DEMUXER 0
+#define CONFIG_IV8_DEMUXER 0
+#define CONFIG_IVF_DEMUXER 0
+#define CONFIG_LMLM4_DEMUXER 0
+#define CONFIG_M4V_DEMUXER 0
+#define CONFIG_MATROSKA_DEMUXER 0
+#define CONFIG_MJPEG_DEMUXER 0
+#define CONFIG_MLP_DEMUXER 0
+#define CONFIG_MM_DEMUXER 0
+#define CONFIG_MMF_DEMUXER 0
+#define CONFIG_MOV_DEMUXER 0
+#define CONFIG_MP3_DEMUXER 0
+#define CONFIG_MPC_DEMUXER 0
+#define CONFIG_MPC8_DEMUXER 0
+#define CONFIG_MPEGPS_DEMUXER 0
+#define CONFIG_MPEGTS_DEMUXER 0
+#define CONFIG_MPEGTSRAW_DEMUXER 0
+#define CONFIG_MPEGVIDEO_DEMUXER 0
+#define CONFIG_MSNWC_TCP_DEMUXER 0
+#define CONFIG_MTV_DEMUXER 0
+#define CONFIG_MVI_DEMUXER 0
+#define CONFIG_MXF_DEMUXER 0
+#define CONFIG_NC_DEMUXER 0
+#define CONFIG_NSV_DEMUXER 0
+#define CONFIG_NUT_DEMUXER 0
+#define CONFIG_NUV_DEMUXER 0
+#define CONFIG_OGG_DEMUXER 0
+#define CONFIG_OMA_DEMUXER 0
+#define CONFIG_PCM_ALAW_DEMUXER 0
+#define CONFIG_PCM_MULAW_DEMUXER 0
+#define CONFIG_PCM_F64BE_DEMUXER 0
+#define CONFIG_PCM_F64LE_DEMUXER 0
+#define CONFIG_PCM_F32BE_DEMUXER 0
+#define CONFIG_PCM_F32LE_DEMUXER 0
+#define CONFIG_PCM_S32BE_DEMUXER 0
+#define CONFIG_PCM_S32LE_DEMUXER 0
+#define CONFIG_PCM_S24BE_DEMUXER 0
+#define CONFIG_PCM_S24LE_DEMUXER 0
+#define CONFIG_PCM_S16BE_DEMUXER 0
+#define CONFIG_PCM_S16LE_DEMUXER 0
+#define CONFIG_PCM_S8_DEMUXER 0
+#define CONFIG_PCM_U32BE_DEMUXER 0
+#define CONFIG_PCM_U32LE_DEMUXER 0
+#define CONFIG_PCM_U24BE_DEMUXER 0
+#define CONFIG_PCM_U24LE_DEMUXER 0
+#define CONFIG_PCM_U16BE_DEMUXER 0
+#define CONFIG_PCM_U16LE_DEMUXER 0
+#define CONFIG_PCM_U8_DEMUXER 0
+#define CONFIG_PVA_DEMUXER 0
+#define CONFIG_QCP_DEMUXER 0
+#define CONFIG_R3D_DEMUXER 0
+#define CONFIG_RAWVIDEO_DEMUXER 0
+#define CONFIG_RL2_DEMUXER 0
+#define CONFIG_RM_DEMUXER 0
+#define CONFIG_ROQ_DEMUXER 0
+#define CONFIG_RPL_DEMUXER 0
+#define CONFIG_RSO_DEMUXER 0
+#define CONFIG_RTSP_DEMUXER 0
+#define CONFIG_SDP_DEMUXER 0
+#define CONFIG_SEGAFILM_DEMUXER 0
+#define CONFIG_SHORTEN_DEMUXER 0
+#define CONFIG_SIFF_DEMUXER 0
+#define CONFIG_SMACKER_DEMUXER 0
+#define CONFIG_SOL_DEMUXER 0
+#define CONFIG_SOX_DEMUXER 0
+#define CONFIG_SRT_DEMUXER 0
+#define CONFIG_STR_DEMUXER 0
+#define CONFIG_SWF_DEMUXER 0
+#define CONFIG_THP_DEMUXER 0
+#define CONFIG_TIERTEXSEQ_DEMUXER 0
+#define CONFIG_TMV_DEMUXER 0
+#define CONFIG_TRUEHD_DEMUXER 0
+#define CONFIG_TTA_DEMUXER 0
+#define CONFIG_TXD_DEMUXER 0
+#define CONFIG_TTY_DEMUXER 0
+#define CONFIG_VC1_DEMUXER 0
+#define CONFIG_VC1T_DEMUXER 0
+#define CONFIG_VMD_DEMUXER 0
+#define CONFIG_VOC_DEMUXER 0
+#define CONFIG_VQF_DEMUXER 0
+#define CONFIG_W64_DEMUXER 0
+#define CONFIG_WAV_DEMUXER 0
+#define CONFIG_WC3_DEMUXER 0
+#define CONFIG_WSAUD_DEMUXER 0
+#define CONFIG_WSVQA_DEMUXER 0
+#define CONFIG_WV_DEMUXER 0
+#define CONFIG_XA_DEMUXER 0
+#define CONFIG_YOP_DEMUXER 0
+#define CONFIG_YUV4MPEGPIPE_DEMUXER 0
+#define CONFIG_LIBNUT_DEMUXER 0
+#define CONFIG_A64_MUXER 0
+#define CONFIG_AC3_MUXER 0
+#define CONFIG_ADTS_MUXER 0
+#define CONFIG_AIFF_MUXER 0
+#define CONFIG_AMR_MUXER 0
+#define CONFIG_ASF_MUXER 0
+#define CONFIG_ASS_MUXER 0
+#define CONFIG_ASF_STREAM_MUXER 0
+#define CONFIG_AU_MUXER 0
+#define CONFIG_AVI_MUXER 0
+#define CONFIG_AVM2_MUXER 0
+#define CONFIG_CAVSVIDEO_MUXER 0
+#define CONFIG_CRC_MUXER 0
+#define CONFIG_DAUD_MUXER 0
+#define CONFIG_DIRAC_MUXER 0
+#define CONFIG_DNXHD_MUXER 0
+#define CONFIG_DTS_MUXER 0
+#define CONFIG_DV_MUXER 0
+#define CONFIG_EAC3_MUXER 0
+#define CONFIG_FFM_MUXER 0
+#define CONFIG_FILMSTRIP_MUXER 0
+#define CONFIG_FLAC_MUXER 0
+#define CONFIG_FLV_MUXER 0
+#define CONFIG_FRAMECRC_MUXER 0
+#define CONFIG_FRAMEMD5_MUXER 0
+#define CONFIG_G722_MUXER 0
+#define CONFIG_GIF_MUXER 0
+#define CONFIG_GXF_MUXER 0
+#define CONFIG_H261_MUXER 0
+#define CONFIG_H263_MUXER 0
+#define CONFIG_H264_MUXER 0
+#define CONFIG_IMAGE2_MUXER 0
+#define CONFIG_IMAGE2PIPE_MUXER 0
+#define CONFIG_IPOD_MUXER 0
+#define CONFIG_M4V_MUXER 0
+#define CONFIG_MD5_MUXER 0
+#define CONFIG_MATROSKA_MUXER 0
+#define CONFIG_MATROSKA_AUDIO_MUXER 0
+#define CONFIG_MJPEG_MUXER 0
+#define CONFIG_MLP_MUXER 0
+#define CONFIG_MMF_MUXER 0
+#define CONFIG_MOV_MUXER 0
+#define CONFIG_MP2_MUXER 0
+#define CONFIG_MP3_MUXER 0
+#define CONFIG_MP4_MUXER 0
+#define CONFIG_MPEG1SYSTEM_MUXER 0
+#define CONFIG_MPEG1VCD_MUXER 0
+#define CONFIG_MPEG1VIDEO_MUXER 0
+#define CONFIG_MPEG2DVD_MUXER 0
+#define CONFIG_MPEG2SVCD_MUXER 0
+#define CONFIG_MPEG2VIDEO_MUXER 0
+#define CONFIG_MPEG2VOB_MUXER 0
+#define CONFIG_MPEGTS_MUXER 0
+#define CONFIG_MPJPEG_MUXER 0
+#define CONFIG_MXF_MUXER 0
+#define CONFIG_MXF_D10_MUXER 0
+#define CONFIG_NULL_MUXER 0
+#define CONFIG_NUT_MUXER 0
+#define CONFIG_OGG_MUXER 0
+#define CONFIG_PCM_ALAW_MUXER 0
+#define CONFIG_PCM_MULAW_MUXER 0
+#define CONFIG_PCM_F64BE_MUXER 0
+#define CONFIG_PCM_F64LE_MUXER 0
+#define CONFIG_PCM_F32BE_MUXER 0
+#define CONFIG_PCM_F32LE_MUXER 0
+#define CONFIG_PCM_S32BE_MUXER 0
+#define CONFIG_PCM_S32LE_MUXER 0
+#define CONFIG_PCM_S24BE_MUXER 0
+#define CONFIG_PCM_S24LE_MUXER 0
+#define CONFIG_PCM_S16BE_MUXER 0
+#define CONFIG_PCM_S16LE_MUXER 0
+#define CONFIG_PCM_S8_MUXER 0
+#define CONFIG_PCM_U32BE_MUXER 0
+#define CONFIG_PCM_U32LE_MUXER 0
+#define CONFIG_PCM_U24BE_MUXER 0
+#define CONFIG_PCM_U24LE_MUXER 0
+#define CONFIG_PCM_U16BE_MUXER 0
+#define CONFIG_PCM_U16LE_MUXER 0
+#define CONFIG_PCM_U8_MUXER 0
+#define CONFIG_PSP_MUXER 0
+#define CONFIG_RAWVIDEO_MUXER 0
+#define CONFIG_RM_MUXER 0
+#define CONFIG_ROQ_MUXER 0
+#define CONFIG_RSO_MUXER 0
+#define CONFIG_RTP_MUXER 0
+#define CONFIG_RTSP_MUXER 0
+#define CONFIG_SOX_MUXER 0
+#define CONFIG_SPDIF_MUXER 0
+#define CONFIG_SRT_MUXER 0
+#define CONFIG_SWF_MUXER 0
+#define CONFIG_TG2_MUXER 0
+#define CONFIG_TGP_MUXER 0
+#define CONFIG_TRUEHD_MUXER 0
+#define CONFIG_VC1T_MUXER 0
+#define CONFIG_VOC_MUXER 0
+#define CONFIG_WAV_MUXER 0
+#define CONFIG_WEBM_MUXER 0
+#define CONFIG_YUV4MPEGPIPE_MUXER 0
+#define CONFIG_LIBNUT_MUXER 0
+#define CONFIG_ANULL_FILTER 0
+#define CONFIG_ANULLSRC_FILTER 0
+#define CONFIG_ANULLSINK_FILTER 0
+#define CONFIG_ASPECT_FILTER 0
+#define CONFIG_BLACKFRAME_FILTER 0
+#define CONFIG_CROP_FILTER 0
+#define CONFIG_DRAWBOX_FILTER 0
+#define CONFIG_FIFO_FILTER 0
+#define CONFIG_FORMAT_FILTER 0
+#define CONFIG_FREI0R_FILTER 0
+#define CONFIG_HFLIP_FILTER 0
+#define CONFIG_NOFORMAT_FILTER 0
+#define CONFIG_NULL_FILTER 0
+#define CONFIG_OCV_SMOOTH_FILTER 0
+#define CONFIG_PAD_FILTER 0
+#define CONFIG_PIXDESCTEST_FILTER 0
+#define CONFIG_PIXELASPECT_FILTER 0
+#define CONFIG_SCALE_FILTER 0
+#define CONFIG_SLICIFY_FILTER 0
+#define CONFIG_UNSHARP_FILTER 0
+#define CONFIG_VFLIP_FILTER 0
+#define CONFIG_YADIF_FILTER 0
+#define CONFIG_BUFFER_FILTER 0
+#define CONFIG_COLOR_FILTER 0
+#define CONFIG_NULLSRC_FILTER 0
+#define CONFIG_NULLSINK_FILTER 0
+#define CONFIG_CONCAT_PROTOCOL 0
+#define CONFIG_FILE_PROTOCOL 0
+#define CONFIG_GOPHER_PROTOCOL 0
+#define CONFIG_HTTP_PROTOCOL 0
+#define CONFIG_MMSH_PROTOCOL 0
+#define CONFIG_MMST_PROTOCOL 0
+#define CONFIG_MD5_PROTOCOL 0
+#define CONFIG_PIPE_PROTOCOL 0
+#define CONFIG_RTMP_PROTOCOL 0
+#define CONFIG_RTMPT_PROTOCOL 0
+#define CONFIG_RTMPE_PROTOCOL 0
+#define CONFIG_RTMPTE_PROTOCOL 0
+#define CONFIG_RTMPS_PROTOCOL 0
+#define CONFIG_RTP_PROTOCOL 0
+#define CONFIG_TCP_PROTOCOL 0
+#define CONFIG_UDP_PROTOCOL 0
+#define CONFIG_ALSA_INDEV 0
+#define CONFIG_BKTR_INDEV 0
+#define CONFIG_DV1394_INDEV 0
+#define CONFIG_JACK_INDEV 0
+#define CONFIG_OSS_INDEV 0
+#define CONFIG_V4L2_INDEV 0
+#define CONFIG_V4L_INDEV 0
+#define CONFIG_VFWCAP_INDEV 0
+#define CONFIG_X11_GRAB_DEVICE_INDEV 0
+#define CONFIG_LIBDC1394_INDEV 0
+#define CONFIG_ALSA_OUTDEV 0
+#define CONFIG_OSS_OUTDEV 0
+
+/*added by hand after ffmpeg update */
+#define CONFIG_LAGARITH_DECODER 0
+#define CONFIG_AAC_LATM_DECODER 0
+#define CONFIG_AC3_FIXED_ENCODER 0
+#define CONFIG_AMRWB_DECODER 0
+#define CONFIG_PCM_LXF_DECODER 0
+#define CONFIG_ASS_ENCODER 0
+#define CONFIG_ASS_DECODER 0
+#define CONFIG_SRT_DECODER 0
+#define CONFIG_AAC_LATM_PARSER 0
+#define CONFIG_FLAC_PARSER 0
+#define CONFIG_MJPEG2JPEG_BSF 0
+
+#endif /* FFMPEG_CONFIG_H */
+
diff --git a/submodules/externals/build/ffmpeg-no-neon/libavutil/avconfig.h b/submodules/externals/build/ffmpeg-no-neon/libavutil/avconfig.h
new file mode 100644
index 000000000..f10aa6186
--- /dev/null
+++ b/submodules/externals/build/ffmpeg-no-neon/libavutil/avconfig.h
@@ -0,0 +1,6 @@
+/* Generated by ffconf */
+#ifndef AVUTIL_AVCONFIG_H
+#define AVUTIL_AVCONFIG_H
+#define AV_HAVE_BIGENDIAN 0
+#define AV_HAVE_FAST_UNALIGNED 1
+#endif /* AVUTIL_AVCONFIG_H */
diff --git a/submodules/linphone b/submodules/linphone
index edad295e0..53d5f0c2b 160000
--- a/submodules/linphone
+++ b/submodules/linphone
@@ -1 +1 @@
-Subproject commit edad295e0596eebc7ca4aed7472e0e3bdc696b41
+Subproject commit 53d5f0c2bf8a5fbbfb04ce4126db81ff3da38916