JLChen
2020-12-10 a8c5f79b0d93adfa7f23601dd0fee30edc14f0d4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <jni.h>
#include <string>
 
#include "baresip/BaresipObj.h"
 
 
JavaListener *javaListener;
BaresipObj *baresipObj;
 
JavaVM *jvm;
JNIEXPORT jint JNI_OnLoad(JavaVM *vm,void *reserved){
    LOGD("JNI_Onload");
    jvm =vm;
    return JNI_VERSION_1_6;
}
 
 
////
extern "C" JNIEXPORT jstring JNICALL
Java_lilin_com_MyCApi_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++1";
 
    return env->NewStringUTF(hello.c_str());
}extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_bareStart(JNIEnv *env, jobject instance) {
    if( javaListener== nullptr ){
        javaListener = new JavaListener(jvm,env,env->NewGlobalRef(instance) );
    }
    baresipObj = new BaresipObj(javaListener);
    baresipObj->startbaresip();
 
}extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_bareStop(JNIEnv *env, jobject instance) {
    LOGE("end..");
    if(baresipObj!= nullptr){
        baresipObj->stopbaresip();
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_barejie(JNIEnv *env, jobject instance) {
    LOGE("jieting");
    if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
        baresipObj->baresipjie();
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_baregua(JNIEnv *env, jobject instance) {
    if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
        baresipObj->baresipgua();
    }
}
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_barecall(JNIEnv *env, jobject instance, jstring num_) {
    const char *sipadr = env->GetStringUTFChars(num_, 0);
    if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
        int err=baresipObj->baresipcall(sipadr);
        LOGE("呼叫return=%d",err);
    }
    env->ReleaseStringUTFChars(num_, sipadr);
}
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_barecallv(JNIEnv *env, jobject instance, jstring num_) {
    const char *sipadr = env->GetStringUTFChars(num_, 0);
    if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
        int err=baresipObj->baresipcallv(sipadr);
        LOGE("呼叫vreturn=%d",err);
    }
    env->ReleaseStringUTFChars(num_, sipadr);
}
 
extern "C"
JNIEXPORT jint JNICALL
Java_lilin_com_MyCApi_bareIsReg(JNIEnv *env, jobject instance) {
    int state=0;
    if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
        state=baresipObj->bareisreg();
    }
   return  state;
}
 
 
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_baresendvdata(JNIEnv *env, jobject instance, jbyteArray data_,jint w,  jint h) {
    jbyte *bytes = env->GetByteArrayElements(data_, NULL);
 
    if(baresipObj->frameQueue!=NULL) {
 
        static int nexttps = 0;
        AVFrame *avFrame = av_frame_alloc();
        int picture_size = av_image_get_buffer_size(AV_PIX_FMT_YUV420P, w, h, 1);
        uint8_t *buffers = (uint8_t *) av_malloc(picture_size);
        av_image_fill_arrays(avFrame->data, avFrame->linesize, buffers, AV_PIX_FMT_YUV420P, w, h, 1);
        int size = w * h;
        memcpy(avFrame->data[0], bytes, size); //Y
        for (int j = 0; j < size / 4; j++) {
            *(avFrame->data[2] + j) = *(bytes + size + j * 2); // V
            *(avFrame->data[1] + j) = *(bytes + size + j * 2 + 1); //U
        }
         //raote
        avFrame->format = AV_PIX_FMT_YUV420P;
        avFrame->width=w;avFrame->height=h;
        if (nexttps == 0) { avFrame->pts = 0; }
        else {
            avFrame->pts = nexttps;
        }
        nexttps = avFrame->pts + 1000000LL * 1 / 25;
        {
            AVRational base;
            base.num = 1;
            base.den = 1000000LL;//帧率
            AVRational base1;
            base1.num = 1;
            base1.den = 25;//帧率
            //转换回去去压缩器的时基
            avFrame->pts = av_rescale_q(avFrame->pts, base, base1);
        }
 
        //LOGE("====%lld", avFrame->pts);
        baresipObj->frameQueue->putAvFrame(avFrame);
    }
    env->ReleaseByteArrayElements(data_, bytes, 0);
}
 
extern "C"
JNIEXPORT void JNICALL
Java_lilin_com_MyCApi_barereg(JNIEnv *env, jobject instance, jstring sipaddress_) {
    const char *sipaddress = env->GetStringUTFChars(sipaddress_, 0);
    if(baresipObj!= nullptr&&baresipObj->baresipstate==1){
        baresipObj->baresipreg( sipaddress );
    }
    env->ReleaseStringUTFChars(sipaddress_, sipaddress);
}