diff --git a/.gitignore b/.gitignore index 12f6ddb2..221ca83a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,9 @@ gen/ local.properties custom_rules.xml ant.properties -*~ \ No newline at end of file +*~ +*.iml +.gradle/ +.idea/ +target/ +build/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..d0a36567 --- /dev/null +++ b/build.gradle @@ -0,0 +1,50 @@ +apply plugin: 'com.android.library' +apply plugin: 'maven' + + +group = 'net.majorkernelpanic' +version = '3.0' + +description = """libstreaming""" + +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.0.0' + } +} + +android { + compileSdkVersion 21 + buildToolsVersion "21.1.1" + + defaultConfig { + minSdkVersion 16 + targetSdkVersion 21 + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } +} + +repositories { + mavenCentral() +} + + +dependencies { + compile fileTree(dir: 'libs', include: ['*.jar']) +} + +uploadArchives { + repositories { + mavenDeployer { + repository url: 'file://' + new File(System.getProperty('user.home'), '.m3/repository').absolutePath + } + } +} +task install(dependsOn: uploadArchives) \ No newline at end of file diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml new file mode 100644 index 00000000..9e2e14dc --- /dev/null +++ b/src/main/AndroidManifest.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/src/net/majorkernelpanic/streaming/MediaStream.java b/src/main/java/net/majorkernelpanic/streaming/MediaStream.java similarity index 87% rename from src/net/majorkernelpanic/streaming/MediaStream.java rename to src/main/java/net/majorkernelpanic/streaming/MediaStream.java index 95fcecdb..979a5057 100644 --- a/src/net/majorkernelpanic/streaming/MediaStream.java +++ b/src/main/java/net/majorkernelpanic/streaming/MediaStream.java @@ -20,22 +20,24 @@ package net.majorkernelpanic.streaming; -import java.io.IOException; -import java.io.OutputStream; -import java.net.InetAddress; -import java.util.Random; - -import net.majorkernelpanic.streaming.audio.AudioStream; -import net.majorkernelpanic.streaming.rtp.AbstractPacketizer; -import net.majorkernelpanic.streaming.video.VideoStream; import android.annotation.SuppressLint; import android.media.MediaCodec; import android.media.MediaRecorder; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; +import android.os.ParcelFileDescriptor; import android.util.Log; +import net.majorkernelpanic.streaming.audio.AudioStream; +import net.majorkernelpanic.streaming.rtp.AbstractPacketizer; +import net.majorkernelpanic.streaming.video.VideoStream; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetAddress; +import java.util.Random; + /** * A MediaRecorder that streams what it records using a packetizer from the RTP package. * You can't use this class directly ! @@ -73,6 +75,9 @@ public abstract class MediaStream implements Stream { protected MediaRecorder mMediaRecorder; protected MediaCodec mMediaCodec; + + protected ParcelFileDescriptor mParcelRead; + protected ParcelFileDescriptor mParcelWrite; static { // We determine whether or not the MediaCodec API should be used @@ -315,25 +320,52 @@ protected void createSockets() throws IOException { mSender.setSendBufferSize(500000); } + protected void setMediaRecorderOutputFile(MediaRecorder mediaRecorder) { + ParcelFileDescriptor[] parcelFileDescriptors = new ParcelFileDescriptor[0]; + + try { + parcelFileDescriptors = ParcelFileDescriptor.createPipe(); + } catch (IOException e) { + Log.e("Zeemi", "ParcelFileDescriptor initialize fail"); + } + + mParcelRead = new ParcelFileDescriptor(parcelFileDescriptors[0]); + mParcelWrite = new ParcelFileDescriptor(parcelFileDescriptors[1]); + mediaRecorder.setOutputFile(mParcelWrite.getFileDescriptor()); + } + protected void closeSockets() { - try { - mReceiver.close(); - } catch (Exception e) { - e.printStackTrace(); - } - try { - mSender.close(); - } catch (Exception e) { - e.printStackTrace(); - } - try { - mLss.close(); - } catch (Exception e) { - e.printStackTrace(); - } - mLss = null; - mSender = null; - mReceiver = null; + try { + mReceiver.close(); + } catch (Exception e) { + e.printStackTrace(); + } + try { + mSender.close(); + } catch (Exception e) { + e.printStackTrace(); + } + try { + mLss.close(); + } catch (Exception e) { + e.printStackTrace(); + } + try { + mParcelRead.close(); + } + catch(Exception e){ + e.printStackTrace(); + } + try { + mParcelWrite.close(); + } catch (Exception e) { + e.printStackTrace(); + } + mLss = null; + mSender = null; + mReceiver = null; + mParcelRead = null; + mParcelWrite = null; } } diff --git a/src/net/majorkernelpanic/streaming/Session.java b/src/main/java/net/majorkernelpanic/streaming/Session.java similarity index 100% rename from src/net/majorkernelpanic/streaming/Session.java rename to src/main/java/net/majorkernelpanic/streaming/Session.java diff --git a/src/net/majorkernelpanic/streaming/SessionBuilder.java b/src/main/java/net/majorkernelpanic/streaming/SessionBuilder.java similarity index 100% rename from src/net/majorkernelpanic/streaming/SessionBuilder.java rename to src/main/java/net/majorkernelpanic/streaming/SessionBuilder.java diff --git a/src/net/majorkernelpanic/streaming/Stream.java b/src/main/java/net/majorkernelpanic/streaming/Stream.java similarity index 100% rename from src/net/majorkernelpanic/streaming/Stream.java rename to src/main/java/net/majorkernelpanic/streaming/Stream.java diff --git a/src/net/majorkernelpanic/streaming/audio/AACStream.java b/src/main/java/net/majorkernelpanic/streaming/audio/AACStream.java similarity index 100% rename from src/net/majorkernelpanic/streaming/audio/AACStream.java rename to src/main/java/net/majorkernelpanic/streaming/audio/AACStream.java diff --git a/src/net/majorkernelpanic/streaming/audio/AMRNBStream.java b/src/main/java/net/majorkernelpanic/streaming/audio/AMRNBStream.java similarity index 100% rename from src/net/majorkernelpanic/streaming/audio/AMRNBStream.java rename to src/main/java/net/majorkernelpanic/streaming/audio/AMRNBStream.java diff --git a/src/net/majorkernelpanic/streaming/audio/AudioQuality.java b/src/main/java/net/majorkernelpanic/streaming/audio/AudioQuality.java similarity index 100% rename from src/net/majorkernelpanic/streaming/audio/AudioQuality.java rename to src/main/java/net/majorkernelpanic/streaming/audio/AudioQuality.java diff --git a/src/net/majorkernelpanic/streaming/audio/AudioStream.java b/src/main/java/net/majorkernelpanic/streaming/audio/AudioStream.java similarity index 100% rename from src/net/majorkernelpanic/streaming/audio/AudioStream.java rename to src/main/java/net/majorkernelpanic/streaming/audio/AudioStream.java diff --git a/src/net/majorkernelpanic/streaming/exceptions/CameraInUseException.java b/src/main/java/net/majorkernelpanic/streaming/exceptions/CameraInUseException.java similarity index 100% rename from src/net/majorkernelpanic/streaming/exceptions/CameraInUseException.java rename to src/main/java/net/majorkernelpanic/streaming/exceptions/CameraInUseException.java diff --git a/src/net/majorkernelpanic/streaming/exceptions/ConfNotSupportedException.java b/src/main/java/net/majorkernelpanic/streaming/exceptions/ConfNotSupportedException.java similarity index 100% rename from src/net/majorkernelpanic/streaming/exceptions/ConfNotSupportedException.java rename to src/main/java/net/majorkernelpanic/streaming/exceptions/ConfNotSupportedException.java diff --git a/src/net/majorkernelpanic/streaming/exceptions/InvalidSurfaceException.java b/src/main/java/net/majorkernelpanic/streaming/exceptions/InvalidSurfaceException.java similarity index 100% rename from src/net/majorkernelpanic/streaming/exceptions/InvalidSurfaceException.java rename to src/main/java/net/majorkernelpanic/streaming/exceptions/InvalidSurfaceException.java diff --git a/src/net/majorkernelpanic/streaming/exceptions/StorageUnavailableException.java b/src/main/java/net/majorkernelpanic/streaming/exceptions/StorageUnavailableException.java similarity index 100% rename from src/net/majorkernelpanic/streaming/exceptions/StorageUnavailableException.java rename to src/main/java/net/majorkernelpanic/streaming/exceptions/StorageUnavailableException.java diff --git a/src/net/majorkernelpanic/streaming/gl/SurfaceManager.java b/src/main/java/net/majorkernelpanic/streaming/gl/SurfaceManager.java similarity index 100% rename from src/net/majorkernelpanic/streaming/gl/SurfaceManager.java rename to src/main/java/net/majorkernelpanic/streaming/gl/SurfaceManager.java diff --git a/src/net/majorkernelpanic/streaming/gl/SurfaceView.java b/src/main/java/net/majorkernelpanic/streaming/gl/SurfaceView.java similarity index 100% rename from src/net/majorkernelpanic/streaming/gl/SurfaceView.java rename to src/main/java/net/majorkernelpanic/streaming/gl/SurfaceView.java diff --git a/src/net/majorkernelpanic/streaming/gl/TextureManager.java b/src/main/java/net/majorkernelpanic/streaming/gl/TextureManager.java similarity index 100% rename from src/net/majorkernelpanic/streaming/gl/TextureManager.java rename to src/main/java/net/majorkernelpanic/streaming/gl/TextureManager.java diff --git a/src/net/majorkernelpanic/streaming/hw/CodecManager.java b/src/main/java/net/majorkernelpanic/streaming/hw/CodecManager.java similarity index 100% rename from src/net/majorkernelpanic/streaming/hw/CodecManager.java rename to src/main/java/net/majorkernelpanic/streaming/hw/CodecManager.java diff --git a/src/net/majorkernelpanic/streaming/hw/EncoderDebugger.java b/src/main/java/net/majorkernelpanic/streaming/hw/EncoderDebugger.java similarity index 95% rename from src/net/majorkernelpanic/streaming/hw/EncoderDebugger.java rename to src/main/java/net/majorkernelpanic/streaming/hw/EncoderDebugger.java index f11d3d81..334054be 100644 --- a/src/net/majorkernelpanic/streaming/hw/EncoderDebugger.java +++ b/src/main/java/net/majorkernelpanic/streaming/hw/EncoderDebugger.java @@ -525,14 +525,20 @@ private void convertToNV21(int k) { * Instantiates and starts the encoder. */ private void configureEncoder() { - mEncoder = MediaCodec.createByCodecName(mEncoderName); - MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight); - mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, BITRATE); - mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, FRAMERATE); - mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, mEncoderColorFormat); - mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); - mEncoder.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); - mEncoder.start(); + try{ + mEncoder = MediaCodec.createByCodecName(mEncoderName); + MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight); + mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, BITRATE); + mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, FRAMERATE); + mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, mEncoderColorFormat); + mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1); + mEncoder.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE); + mEncoder.start(); + } + catch (Exception e) { + Log.e(getClass().getSimpleName(),"configureEncoder"); + Log.e(getClass().getSimpleName(), e.getStackTrace().toString()); + } } private void releaseEncoder() { @@ -558,12 +564,18 @@ private void configureDecoder() { csd0.put(new byte[] {0x00,0x00,0x00,0x01}); csd0.put(mPPS); - mDecoder = MediaCodec.createByCodecName(mDecoderName); - MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight); - mediaFormat.setByteBuffer("csd-0", csd0); - mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, mDecoderColorFormat); - mDecoder.configure(mediaFormat, null, null, 0); - mDecoder.start(); + try{ + mDecoder = MediaCodec.createByCodecName(mDecoderName); + MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, mWidth, mHeight); + mediaFormat.setByteBuffer("csd-0", csd0); + mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, mDecoderColorFormat); + mDecoder.configure(mediaFormat, null, null, 0); + mDecoder.start(); + } + catch (Exception e) { + Log.e(getClass().getSimpleName(),"configureDecoder"); + Log.e(getClass().getSimpleName(), e.getStackTrace().toString()); + } ByteBuffer[] decInputBuffers = mDecoder.getInputBuffers(); diff --git a/src/net/majorkernelpanic/streaming/hw/NV21Convertor.java b/src/main/java/net/majorkernelpanic/streaming/hw/NV21Convertor.java similarity index 100% rename from src/net/majorkernelpanic/streaming/hw/NV21Convertor.java rename to src/main/java/net/majorkernelpanic/streaming/hw/NV21Convertor.java diff --git a/src/net/majorkernelpanic/streaming/mp4/MP4Config.java b/src/main/java/net/majorkernelpanic/streaming/mp4/MP4Config.java similarity index 100% rename from src/net/majorkernelpanic/streaming/mp4/MP4Config.java rename to src/main/java/net/majorkernelpanic/streaming/mp4/MP4Config.java diff --git a/src/net/majorkernelpanic/streaming/mp4/MP4Parser.java b/src/main/java/net/majorkernelpanic/streaming/mp4/MP4Parser.java similarity index 100% rename from src/net/majorkernelpanic/streaming/mp4/MP4Parser.java rename to src/main/java/net/majorkernelpanic/streaming/mp4/MP4Parser.java diff --git a/src/net/majorkernelpanic/streaming/rtcp/SenderReport.java b/src/main/java/net/majorkernelpanic/streaming/rtcp/SenderReport.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtcp/SenderReport.java rename to src/main/java/net/majorkernelpanic/streaming/rtcp/SenderReport.java diff --git a/src/net/majorkernelpanic/streaming/rtp/AACADTSPacketizer.java b/src/main/java/net/majorkernelpanic/streaming/rtp/AACADTSPacketizer.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/AACADTSPacketizer.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/AACADTSPacketizer.java diff --git a/src/net/majorkernelpanic/streaming/rtp/AACLATMPacketizer.java b/src/main/java/net/majorkernelpanic/streaming/rtp/AACLATMPacketizer.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/AACLATMPacketizer.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/AACLATMPacketizer.java diff --git a/src/net/majorkernelpanic/streaming/rtp/AMRNBPacketizer.java b/src/main/java/net/majorkernelpanic/streaming/rtp/AMRNBPacketizer.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/AMRNBPacketizer.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/AMRNBPacketizer.java diff --git a/src/net/majorkernelpanic/streaming/rtp/AbstractPacketizer.java b/src/main/java/net/majorkernelpanic/streaming/rtp/AbstractPacketizer.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/AbstractPacketizer.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/AbstractPacketizer.java diff --git a/src/net/majorkernelpanic/streaming/rtp/H263Packetizer.java b/src/main/java/net/majorkernelpanic/streaming/rtp/H263Packetizer.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/H263Packetizer.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/H263Packetizer.java diff --git a/src/net/majorkernelpanic/streaming/rtp/H264Packetizer.java b/src/main/java/net/majorkernelpanic/streaming/rtp/H264Packetizer.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/H264Packetizer.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/H264Packetizer.java diff --git a/src/net/majorkernelpanic/streaming/rtp/MediaCodecInputStream.java b/src/main/java/net/majorkernelpanic/streaming/rtp/MediaCodecInputStream.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/MediaCodecInputStream.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/MediaCodecInputStream.java diff --git a/src/net/majorkernelpanic/streaming/rtp/RtpSocket.java b/src/main/java/net/majorkernelpanic/streaming/rtp/RtpSocket.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtp/RtpSocket.java rename to src/main/java/net/majorkernelpanic/streaming/rtp/RtpSocket.java diff --git a/src/net/majorkernelpanic/streaming/rtsp/RtcpDeinterleaver.java b/src/main/java/net/majorkernelpanic/streaming/rtsp/RtcpDeinterleaver.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtsp/RtcpDeinterleaver.java rename to src/main/java/net/majorkernelpanic/streaming/rtsp/RtcpDeinterleaver.java diff --git a/src/net/majorkernelpanic/streaming/rtsp/RtspClient.java b/src/main/java/net/majorkernelpanic/streaming/rtsp/RtspClient.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtsp/RtspClient.java rename to src/main/java/net/majorkernelpanic/streaming/rtsp/RtspClient.java diff --git a/src/net/majorkernelpanic/streaming/rtsp/RtspServer.java b/src/main/java/net/majorkernelpanic/streaming/rtsp/RtspServer.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtsp/RtspServer.java rename to src/main/java/net/majorkernelpanic/streaming/rtsp/RtspServer.java diff --git a/src/net/majorkernelpanic/streaming/rtsp/UriParser.java b/src/main/java/net/majorkernelpanic/streaming/rtsp/UriParser.java similarity index 100% rename from src/net/majorkernelpanic/streaming/rtsp/UriParser.java rename to src/main/java/net/majorkernelpanic/streaming/rtsp/UriParser.java diff --git a/src/net/majorkernelpanic/streaming/video/CodecManager.java b/src/main/java/net/majorkernelpanic/streaming/video/CodecManager.java similarity index 100% rename from src/net/majorkernelpanic/streaming/video/CodecManager.java rename to src/main/java/net/majorkernelpanic/streaming/video/CodecManager.java diff --git a/src/net/majorkernelpanic/streaming/video/H263Stream.java b/src/main/java/net/majorkernelpanic/streaming/video/H263Stream.java similarity index 100% rename from src/net/majorkernelpanic/streaming/video/H263Stream.java rename to src/main/java/net/majorkernelpanic/streaming/video/H263Stream.java diff --git a/src/net/majorkernelpanic/streaming/video/H264Stream.java b/src/main/java/net/majorkernelpanic/streaming/video/H264Stream.java similarity index 100% rename from src/net/majorkernelpanic/streaming/video/H264Stream.java rename to src/main/java/net/majorkernelpanic/streaming/video/H264Stream.java diff --git a/src/net/majorkernelpanic/streaming/video/VideoQuality.java b/src/main/java/net/majorkernelpanic/streaming/video/VideoQuality.java similarity index 100% rename from src/net/majorkernelpanic/streaming/video/VideoQuality.java rename to src/main/java/net/majorkernelpanic/streaming/video/VideoQuality.java diff --git a/src/net/majorkernelpanic/streaming/video/VideoStream.java b/src/main/java/net/majorkernelpanic/streaming/video/VideoStream.java similarity index 94% rename from src/net/majorkernelpanic/streaming/video/VideoStream.java rename to src/main/java/net/majorkernelpanic/streaming/video/VideoStream.java index 165fb8db..5df42f38 100644 --- a/src/net/majorkernelpanic/streaming/video/VideoStream.java +++ b/src/main/java/net/majorkernelpanic/streaming/video/VideoStream.java @@ -20,21 +20,6 @@ package net.majorkernelpanic.streaming.video; -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.util.concurrent.Semaphore; -import java.util.concurrent.TimeUnit; - -import net.majorkernelpanic.streaming.MediaStream; -import net.majorkernelpanic.streaming.Stream; -import net.majorkernelpanic.streaming.exceptions.CameraInUseException; -import net.majorkernelpanic.streaming.exceptions.ConfNotSupportedException; -import net.majorkernelpanic.streaming.exceptions.InvalidSurfaceException; -import net.majorkernelpanic.streaming.gl.SurfaceView; -import net.majorkernelpanic.streaming.hw.EncoderDebugger; -import net.majorkernelpanic.streaming.hw.NV21Convertor; -import net.majorkernelpanic.streaming.rtp.MediaCodecInputStream; import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; @@ -45,12 +30,30 @@ import android.media.MediaCodecInfo; import android.media.MediaFormat; import android.media.MediaRecorder; +import android.os.Build; import android.os.Looper; +import android.os.ParcelFileDescriptor; import android.util.Log; import android.view.Surface; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; +import net.majorkernelpanic.streaming.MediaStream; +import net.majorkernelpanic.streaming.Stream; +import net.majorkernelpanic.streaming.exceptions.CameraInUseException; +import net.majorkernelpanic.streaming.exceptions.ConfNotSupportedException; +import net.majorkernelpanic.streaming.exceptions.InvalidSurfaceException; +import net.majorkernelpanic.streaming.gl.SurfaceView; +import net.majorkernelpanic.streaming.hw.EncoderDebugger; +import net.majorkernelpanic.streaming.hw.NV21Convertor; +import net.majorkernelpanic.streaming.rtp.MediaCodecInputStream; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + /** * Don't use this class directly. */ @@ -80,9 +83,9 @@ public abstract class VideoStream extends MediaStream { protected String mEncoderName; protected int mEncoderColorFormat; protected int mCameraImageFormat; - protected int mMaxFps = 0; + protected int mMaxFps = 0; - /** + /** * Don't use this class directly. * Uses CAMERA_FACING_BACK by default. */ @@ -328,6 +331,7 @@ public synchronized void stopPreview() { protected void encodeWithMediaRecorder() throws IOException, ConfNotSupportedException { Log.d(TAG,"Video encoded using the MediaRecorder API"); + Log.e(TAG, "VideoStream Initial 1152"); // We need a local socket to forward data output by the camera to the packetizer createSockets(); @@ -355,7 +359,12 @@ protected void encodeWithMediaRecorder() throws IOException, ConfNotSupportedExc // We write the ouput of the camera in a local socket instead of a file ! // This one little trick makes streaming feasible quiet simply: data from the camera // can then be manipulated at the other end of the socket - mMediaRecorder.setOutputFile(mSender.getFileDescriptor()); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + setMediaRecorderOutputFile(mMediaRecorder); + } + else { + mMediaRecorder.setOutputFile(mSender.getFileDescriptor()); + } mMediaRecorder.prepare(); mMediaRecorder.start(); @@ -365,13 +374,20 @@ protected void encodeWithMediaRecorder() throws IOException, ConfNotSupportedExc } // This will skip the MPEG4 header if this step fails we can't stream anything :( - InputStream is = mReceiver.getInputStream(); - try { + InputStream inputStream; + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + inputStream = new ParcelFileDescriptor.AutoCloseInputStream(mParcelRead); + } + else { + inputStream = mReceiver.getInputStream(); + } + + try { byte buffer[] = new byte[4]; // Skip all atoms preceding mdat atom while (!Thread.interrupted()) { - while (is.read() != 'm'); - is.read(buffer,0,3); + while (inputStream.read() != 'm'); + inputStream.read(buffer, 0, 3); if (buffer[0] == 'd' && buffer[1] == 'a' && buffer[2] == 't') break; } } catch (IOException e) { @@ -381,9 +397,15 @@ protected void encodeWithMediaRecorder() throws IOException, ConfNotSupportedExc } // The packetizer encapsulates the bit stream in an RTP stream and send it over the network - mPacketizer.setInputStream(mReceiver.getInputStream()); - mPacketizer.start(); + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + mPacketizer.setInputStream(inputStream); + } + else { + mPacketizer.setInputStream(mReceiver.getInputStream()); + } + + mPacketizer.start(); mStreaming = true; } @@ -585,9 +607,10 @@ public void onError(int error, Camera camera) { if (parameters.getFlashMode()!=null) { parameters.setFlashMode(mFlashEnabled?Parameters.FLASH_MODE_TORCH:Parameters.FLASH_MODE_OFF); } - parameters.setRecordingHint(true); - mCamera.setParameters(parameters); - mCamera.setDisplayOrientation(mOrientation); + parameters.setRecordingHint(true); + parameters.set("cam_mode", 1); + mCamera.setParameters(parameters); + mCamera.setDisplayOrientation(mOrientation); try { if (mMode == MODE_MEDIACODEC_API_2) {