|
|
@ -6,6 +6,11 @@ |
|
|
|
#include "VideoStream.h" |
|
|
|
#include "VideoStream.h" |
|
|
|
#include "AudioStream.h" |
|
|
|
#include "AudioStream.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define RTMP_PUSHER_FUNC(RETURN_TYPE, FUNC_NAME, ...) \ |
|
|
|
|
|
|
|
extern "C" \
|
|
|
|
|
|
|
|
JNIEXPORT RETURN_TYPE JNICALL Java_com_frank_live_LivePusherNew_ ## FUNC_NAME \
|
|
|
|
|
|
|
|
(JNIEnv *env, jobject instance, ##__VA_ARGS__)\
|
|
|
|
|
|
|
|
|
|
|
|
SafeQueue<RTMPPacket *> packets; |
|
|
|
SafeQueue<RTMPPacket *> packets; |
|
|
|
VideoStream *videoStream = 0; |
|
|
|
VideoStream *videoStream = 0; |
|
|
|
int isStart = 0; |
|
|
|
int isStart = 0; |
|
|
@ -55,14 +60,6 @@ void throwErrToJava(int error_code) { |
|
|
|
javaVM->DetachCurrentThread(); |
|
|
|
javaVM->DetachCurrentThread(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void releasePackets(RTMPPacket *&packet) { |
|
|
|
|
|
|
|
if (packet) { |
|
|
|
|
|
|
|
RTMPPacket_Free(packet); |
|
|
|
|
|
|
|
delete packet; |
|
|
|
|
|
|
|
packet = 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void callback(RTMPPacket *packet) { |
|
|
|
void callback(RTMPPacket *packet) { |
|
|
|
if (packet) { |
|
|
|
if (packet) { |
|
|
|
packet->m_nTimeStamp = RTMP_GetTime() - start_time; |
|
|
|
packet->m_nTimeStamp = RTMP_GetTime() - start_time; |
|
|
@ -70,24 +67,11 @@ void callback(RTMPPacket *packet) { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
void releasePackets(RTMPPacket *&packet) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
if (packet) { |
|
|
|
Java_com_frank_live_LivePusherNew_native_1init(JNIEnv *env, jobject instance) { |
|
|
|
RTMPPacket_Free(packet); |
|
|
|
videoStream = new VideoStream; |
|
|
|
delete packet; |
|
|
|
videoStream->setVideoCallback(callback); |
|
|
|
packet = 0; |
|
|
|
audioStream = new AudioStream; |
|
|
|
|
|
|
|
audioStream->setAudioCallback(callback); |
|
|
|
|
|
|
|
packets.setReleaseCallback(releasePackets); |
|
|
|
|
|
|
|
jobject_error = env->NewGlobalRef(instance); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
|
|
|
|
JNIEXPORT void JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_native_1setVideoCodecInfo(JNIEnv *env, jobject instance, |
|
|
|
|
|
|
|
jint width, jint height, jint fps, |
|
|
|
|
|
|
|
jint bitrate) { |
|
|
|
|
|
|
|
if (videoStream) { |
|
|
|
|
|
|
|
videoStream->setVideoEncInfo(width, height, fps, bitrate); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -160,10 +144,23 @@ void *start(void *args) { |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(void, native_1init) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
videoStream = new VideoStream; |
|
|
|
Java_com_frank_live_LivePusherNew_native_1start(JNIEnv *env, jobject instance, |
|
|
|
videoStream->setVideoCallback(callback); |
|
|
|
jstring path_) { |
|
|
|
audioStream = new AudioStream; |
|
|
|
|
|
|
|
audioStream->setAudioCallback(callback); |
|
|
|
|
|
|
|
packets.setReleaseCallback(releasePackets); |
|
|
|
|
|
|
|
jobject_error = env->NewGlobalRef(instance); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RTMP_PUSHER_FUNC(void, native_1setVideoCodecInfo, |
|
|
|
|
|
|
|
jint width, jint height, jint fps, jint bitrate) { |
|
|
|
|
|
|
|
if (videoStream) { |
|
|
|
|
|
|
|
videoStream->setVideoEncInfo(width, height, fps, bitrate); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RTMP_PUSHER_FUNC(void, native_1start, jstring path_) { |
|
|
|
if (isStart) { |
|
|
|
if (isStart) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
@ -175,10 +172,7 @@ Java_com_frank_live_LivePusherNew_native_1start(JNIEnv *env, jobject instance, |
|
|
|
env->ReleaseStringUTFChars(path_, path); |
|
|
|
env->ReleaseStringUTFChars(path_, path); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(void, native_1pushVideo, jbyteArray data_) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_native_1pushVideo(JNIEnv *env, jobject instance, |
|
|
|
|
|
|
|
jbyteArray data_) { |
|
|
|
|
|
|
|
if (!videoStream || !readyPushing) { |
|
|
|
if (!videoStream || !readyPushing) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
@ -187,10 +181,7 @@ Java_com_frank_live_LivePusherNew_native_1pushVideo(JNIEnv *env, jobject instanc |
|
|
|
env->ReleaseByteArrayElements(data_, data, 0); |
|
|
|
env->ReleaseByteArrayElements(data_, data, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(void, native_1pushVideoNew, jbyteArray y, jbyteArray u, jbyteArray v) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_native_1pushVideoNew(JNIEnv *env, jobject instance, |
|
|
|
|
|
|
|
jbyteArray y, jbyteArray u, jbyteArray v) { |
|
|
|
|
|
|
|
if (!videoStream || !readyPushing) { |
|
|
|
if (!videoStream || !readyPushing) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
@ -203,52 +194,35 @@ Java_com_frank_live_LivePusherNew_native_1pushVideoNew(JNIEnv *env, jobject inst |
|
|
|
env->ReleaseByteArrayElements(v, v_plane, 0); |
|
|
|
env->ReleaseByteArrayElements(v, v_plane, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(void, native_1setAudioCodecInfo, jint sampleRateInHz, jint channels) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_native_1setAudioCodecInfo(JNIEnv *env, jobject instance, |
|
|
|
|
|
|
|
jint sampleRateInHz, |
|
|
|
|
|
|
|
jint channels) { |
|
|
|
|
|
|
|
if (audioStream) { |
|
|
|
if (audioStream) { |
|
|
|
audioStream->setAudioEncInfo(sampleRateInHz, channels); |
|
|
|
audioStream->setAudioEncInfo(sampleRateInHz, channels); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(jint, getInputSamples) { |
|
|
|
JNIEXPORT jint JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_getInputSamples(JNIEnv *env, jobject instance) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (audioStream) { |
|
|
|
if (audioStream) { |
|
|
|
return audioStream->getInputSamples(); |
|
|
|
return audioStream->getInputSamples(); |
|
|
|
} |
|
|
|
} |
|
|
|
return -1; |
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(void, native_1pushAudio, jbyteArray data_) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_native_1pushAudio(JNIEnv *env, jobject instance, |
|
|
|
|
|
|
|
jbyteArray data_) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!audioStream || !readyPushing) { |
|
|
|
if (!audioStream || !readyPushing) { |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
jbyte *data = env->GetByteArrayElements(data_, NULL); |
|
|
|
jbyte *data = env->GetByteArrayElements(data_, NULL); |
|
|
|
audioStream->encodeData(data); |
|
|
|
audioStream->encodeData(data); |
|
|
|
env->ReleaseByteArrayElements(data_, data, 0); |
|
|
|
env->ReleaseByteArrayElements(data_, data, 0); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(void, native_1stop) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_native_1stop(JNIEnv *env, jobject instance) { |
|
|
|
|
|
|
|
readyPushing = 0; |
|
|
|
readyPushing = 0; |
|
|
|
packets.setWork(0); |
|
|
|
packets.setWork(0); |
|
|
|
pthread_join(pid, 0); |
|
|
|
pthread_join(pid, 0); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
extern "C" |
|
|
|
RTMP_PUSHER_FUNC(void, native_1release) { |
|
|
|
JNIEXPORT void JNICALL |
|
|
|
|
|
|
|
Java_com_frank_live_LivePusherNew_native_1release(JNIEnv *env, jobject instance) { |
|
|
|
|
|
|
|
env->DeleteGlobalRef(jobject_error); |
|
|
|
env->DeleteGlobalRef(jobject_error); |
|
|
|
DELETE(videoStream); |
|
|
|
DELETE(videoStream); |
|
|
|
DELETE(audioStream); |
|
|
|
DELETE(audioStream); |
|
|
|