[android] MediaRecorder prepare() causes segfault
- by dwilde1
Folks,
I have a situation where my MediaRecorder instance causes a segfault.
I'm working with a HTC Hero, Android 1.5+APIs. I've tried all variations, including 3gpp and H.263 and reducing the video resolution to 320x240. What am I missing? The state machine causes 4 MediaPlayer beeps and then turns on the video camera. Here's the pertinent source:
UPDATE: ADDING SURFACE CREATE INFO I have rebooted the device based on previous answer to similar question.
UPDATE 2: I seem to be following the MediaRecorder state machine perfectly, and if I trap out the MR code, the blank surface displays perfectly and everything else functions perfectly. I can record videos manually and play back via MediaPlayer in my code, so there should be nothing wrong with the underlying code. I've copied sample code on the surface and surfaceHolder code. I've looked at the MR instance in the Debug perspective in Eclipse and see that all (known) variables seem to be instantiated correctly. The setter calls are all now implemented in the exaxct order specced in the state diagram.
// in activity class definition
protected MediaPlayer mPlayer;
protected MediaRecorder mRecorder;
protected boolean inCapture = false;
protected int phaseCapture = 0;
protected int durCapturePhase = INF;
protected SurfaceView surface;
protected SurfaceHolder surfaceHolder;
// in onCreate()
// panelPreview is an empty LinearLayout
surface = new SurfaceView(getApplicationContext());
surfaceHolder = surface.getHolder();
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
panelPreview.addView(surface);
// in timer handler runnable
if (mRecorder == null) mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile(path + "/" + vlip);
mRecorder.setVideoSize(320, 240);
mRecorder.setVideoFrameRate(15);
mRecorder.setPreviewDisplay(surfaceHolder.getSurface());
panelPreview.setVisibility(LinearLayout.VISIBLE);
mRecorder.prepare();
mRecorder.start();
Here is a complete log trace for the process run and crash:
I/ActivityManager( 80): Start proc com.ejf.convince.jenplus for
activity com.ejf.convince.jenplus/.JenPLUS: pid=17738 uid=10075
gids={1006, 3003}
I/jdwp (17738): received file descriptor 10 from ADB
W/System.err(17738): Can't dispatch DDM chunk 46454154: no handler
defined
W/System.err(17738): Can't dispatch DDM chunk 4d505251: no handler
defined
I/WindowManager( 80): Screen status=true, current orientation=-1,
SensorEnabled=false
I/WindowManager( 80): needSensorRunningLp, mCurrentAppOrientation
=-1
I/WindowManager( 80): Enabling listeners
W/ActivityThread(17738): Application com.ejf.convince.jenplus is
waiting for the debugger on port 8100...
I/System.out(17738): Sending WAIT chunk
I/dalvikvm(17738): Debugger is active
I/AlertDialog( 80): [onCreate] auto launch SIP.
I/WindowManager( 80): onOrientationChanged, rotation changed to 0
I/System.out(17738): Debugger has connected
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): waiting for debugger to settle...
I/System.out(17738): debugger has settled (1370)
I/ActivityManager( 80): Displayed activity
com.ejf.convince.jenplus/.JenPLUS: 5186 ms
I/OpenCore( 2696): [Hank debug] LN 289 FN CreateNode
I/AudioHardwareMSM72XX( 2696): AUDIO_START: start kernel pcm_out
driver.
W/AudioFlinger( 2696): write blocked for 96 msecs
I/PlayerDriver( 2696): CIQ 1625 sendEvent state=5
I/OpenCore( 2696): [Hank debug] LN 289 FN CreateNode
I/PlayerDriver( 2696): CIQ 1625 sendEvent state=5
I/OpenCore( 2696): [Hank debug] LN 289 FN CreateNode
I/PlayerDriver( 2696): CIQ 1625 sendEvent state=5
I/OpenCore( 2696): [Hank debug] LN 289 FN CreateNode
I/PlayerDriver( 2696): CIQ 1625 sendEvent state=5
W/AuthorDriver( 2696): Intended width(640) exceeds the max allowed
width(352). Max width is used instead.
W/AuthorDriver( 2696): Intended height(480) exceeds the max allowed
height(288). Max height is used instead.
I/AudioHardwareMSM72XX( 2696): AudioHardware pcm playback is going to
standby.
I/DEBUG (16094): *** *** *** *** *** *** *** *** *** *** *** *** ***
*** *** ***
I/DEBUG (16094): Build fingerprint: 'sprint/htc_heroc/heroc/heroc:
1.5/CUPCAKE/85027:user/release-keys'
I/DEBUG (16094): pid: 17738, tid: 17738
com.ejf.convince.jenplus
Thanks in advance!
-- Don Wilde
http://www.ConvinceProject.com