diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index d5755a7..ae0daf8 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -30,7 +30,7 @@ add_library( # Sets the name of the library. src/main/cpp/video_player.c src/main/cpp/ffmpeg_pusher.cpp src/main/cpp/packet_queue.cpp - src/main/cpp/media_player.c + src/main/cpp/media_player.cpp src/main/cpp/video_filter.c src/main/cpp/fast_start.c src/main/cpp/ffprobe_cmd.c diff --git a/app/src/main/cpp/ffmpeg_jni_define.h b/app/src/main/cpp/ffmpeg_jni_define.h index b8c2b43..ce9ca4c 100644 --- a/app/src/main/cpp/ffmpeg_jni_define.h +++ b/app/src/main/cpp/ffmpeg_jni_define.h @@ -23,6 +23,10 @@ (JNIEnv *env, jobject thiz, ##__VA_ARGS__)\ #define MEDIA_PLAYER_FUNC(RETURN_TYPE, FUNC_NAME, ...) \ +extern "C" { \ + JNIEXPORT RETURN_TYPE JNICALL Java_com_frank_ffmpeg_MediaPlayer_ ## FUNC_NAME \ + (JNIEnv *env, jobject thiz, ##__VA_ARGS__);\ +}\ JNIEXPORT RETURN_TYPE JNICALL Java_com_frank_ffmpeg_MediaPlayer_ ## FUNC_NAME \ (JNIEnv *env, jobject thiz, ##__VA_ARGS__)\ diff --git a/app/src/main/cpp/media_player.c b/app/src/main/cpp/media_player.cpp similarity index 87% rename from app/src/main/cpp/media_player.c rename to app/src/main/cpp/media_player.cpp index bcf5ca6..41a6e25 100644 --- a/app/src/main/cpp/media_player.c +++ b/app/src/main/cpp/media_player.cpp @@ -1,21 +1,28 @@ // // Created by frank on 2018/2/3. // -#include "libavcodec/avcodec.h" -#include "libavformat/avformat.h" -#include "libswscale/swscale.h" -#include "libswresample/swresample.h" -#include "packet_queue.h" #include #include #include #include -#include #include #include #include -#include + +#ifdef __cplusplus +extern "C" { +#endif +#include "libavcodec/avcodec.h" +#include "libavformat/avformat.h" +#include "libavutil/imgutils.h" +#include "libavutil/time.h" +#include "libswscale/swscale.h" +#include "libswresample/swresample.h" +#include "packet_queue.h" #include "ffmpeg_jni_define.h" +#ifdef __cplusplus +} +#endif #define TAG "MediaPlayer" @@ -93,10 +100,10 @@ int init_input_format_context(MediaPlayer* player, const char* file_name){ player->video_stream_index = -1; player->audio_stream_index = -1; for (i = 0; i < player->format_context->nb_streams; i++) { - if (player->format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO + if (player->format_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && player->video_stream_index < 0) { player->video_stream_index = i; - } else if (player->format_context->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO + } else if (player->format_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && player->audio_stream_index < 0) { player->audio_stream_index = i; } @@ -115,7 +122,7 @@ int init_input_format_context(MediaPlayer* player, const char* file_name){ } //open decoder -int init_condec_context(MediaPlayer* player){ +int init_codec_context(MediaPlayer* player){ //get codec context player->video_codec_context = player->format_context->streams[player->video_stream_index]->codec; //find audio and video decoder @@ -184,7 +191,7 @@ void player_wait_for_frame(MediaPlayer *player, int64_t stream_time) { // (unsigned int) (sleep_time / 1000ll)); gettimeofday(&now, NULL); timeout.tv_sec = now.tv_sec; - timeout.tv_nsec = (now.tv_usec + sleep_time) * 1000; + timeout.tv_nsec = static_cast((now.tv_usec + sleep_time) * 1000); pthread_cond_timedwait(&player->cond, &player->mutex, &timeout); } pthread_mutex_unlock(&player->mutex); @@ -236,7 +243,7 @@ int decode_video(MediaPlayer* player, AVPacket* packet){ sws_scale(sws_ctx, (uint8_t const * const *)player->yuv_frame->data, player->yuv_frame->linesize, 0, player->video_height, player->rgba_frame->data, player->rgba_frame->linesize); - uint8_t * dst = windowBuffer.bits; + uint8_t * dst = static_cast(windowBuffer.bits); int dstStride = windowBuffer.stride * 4; uint8_t * src = player->rgba_frame->data[0]; int srcStride = player->rgba_frame->linesize[0]; @@ -284,26 +291,26 @@ void audio_decoder_prepare(MediaPlayer* player) { player->out_channel_nb = av_get_channel_layout_nb_channels(out_ch_layout); } -void audio_player_prepare(MediaPlayer* player, JNIEnv* env, jclass jthiz){ - jclass player_class = (*env)->GetObjectClass(env,jthiz); +void audio_player_prepare(MediaPlayer* player, JNIEnv* env, jobject thiz){ + jclass player_class = env->GetObjectClass(thiz); if(!player_class){ LOGE(TAG, "player_class not found..."); } //get AudioTrack by reflection - jmethodID audio_track_method = (*env)->GetMethodID( - env,player_class,"createAudioTrack","(II)Landroid/media/AudioTrack;"); + jmethodID audio_track_method = env->GetMethodID( + player_class,"createAudioTrack","(II)Landroid/media/AudioTrack;"); if(!audio_track_method){ LOGE(TAG, "audio_track_method not found..."); } - jobject audio_track = (*env)->CallObjectMethod( - env,jthiz,audio_track_method, player->out_sample_rate, player->out_channel_nb); + jobject audio_track = env->CallObjectMethod( + thiz, audio_track_method, player->out_sample_rate, player->out_channel_nb); - jclass audio_track_class = (*env)->GetObjectClass(env, audio_track); - jmethodID audio_track_play_mid = (*env)->GetMethodID(env,audio_track_class,"play","()V"); - (*env)->CallVoidMethod(env, audio_track, audio_track_play_mid); + jclass audio_track_class = env->GetObjectClass(audio_track); + jmethodID audio_track_play_mid = env->GetMethodID(audio_track_class,"play","()V"); + env->CallVoidMethod(audio_track, audio_track_play_mid); - player->audio_track = (*env)->NewGlobalRef(env, audio_track); - player->audio_track_write_mid = (*env)->GetMethodID(env,audio_track_class,"write","([BII)I"); + player->audio_track = env->NewGlobalRef(audio_track); + player->audio_track_write_mid = env->GetMethodID(audio_track_class,"write","([BII)I"); //malloc buffer player->audio_buffer = (uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE); @@ -342,20 +349,20 @@ int decode_audio(MediaPlayer* player, AVPacket* packet){ if(javaVM != NULL){ JNIEnv * env; - (*javaVM)->AttachCurrentThread(javaVM, &env, NULL); - jbyteArray audio_sample_array = (*env)->NewByteArray(env,out_buffer_size); - jbyte* sample_byte_array = (*env)->GetByteArrayElements(env,audio_sample_array,NULL); + javaVM->AttachCurrentThread(&env, NULL); + jbyteArray audio_sample_array = env->NewByteArray(out_buffer_size); + jbyte* sample_byte_array = env->GetByteArrayElements(audio_sample_array,NULL); memcpy(sample_byte_array, player->audio_buffer, (size_t) out_buffer_size); - (*env)->ReleaseByteArrayElements(env,audio_sample_array,sample_byte_array,0); + env->ReleaseByteArrayElements(audio_sample_array,sample_byte_array,0); //call write method of AudioTrack to play - (*env)->CallIntMethod(env, player->audio_track, player->audio_track_write_mid, + env->CallIntMethod(player->audio_track, player->audio_track_write_mid, audio_sample_array,0,out_buffer_size); //release local reference - (*env)->DeleteLocalRef(env,audio_sample_array); + env->DeleteLocalRef(audio_sample_array); } } if(javaVM != NULL){ - (*javaVM)->DetachCurrentThread(javaVM); + javaVM->DetachCurrentThread(); } return 0; } @@ -388,7 +395,8 @@ void* write_packet_to_queue(void* arg){ if(pkt->stream_index == player->video_stream_index || pkt->stream_index == player->audio_stream_index){ AVPacketQueue *queue = player->packets[pkt->stream_index]; pthread_mutex_lock(&player->mutex); - AVPacket* data = queue_push(queue, &player->mutex, &player->cond); + AVPacket* data = static_cast(queue_push(queue, &player->mutex, + &player->cond)); pthread_mutex_unlock(&player->mutex); *data = packet; } @@ -422,9 +430,9 @@ void* decode_func(void* arg){ MEDIA_PLAYER_FUNC(jint, setup, jstring filePath, jobject surface){ - const char *file_name = (*env)->GetStringUTFChars(env, filePath, JNI_FALSE); + const char *file_name = env->GetStringUTFChars(filePath, JNI_FALSE); int ret; - player = malloc(sizeof(MediaPlayer)); + player = static_cast(malloc(sizeof(MediaPlayer))); if(player == NULL){ return -1; } @@ -432,7 +440,7 @@ MEDIA_PLAYER_FUNC(jint, setup, jstring filePath, jobject surface){ if(ret < 0){ return ret; } - ret = init_condec_context(player); + ret = init_codec_context(player); if(ret < 0){ return ret; } @@ -486,5 +494,5 @@ MEDIA_PLAYER_FUNC(void, release){ pthread_cond_destroy(&player->cond); pthread_mutex_destroy(&player->mutex); free(player); - (*javaVM)->DestroyJavaVM(javaVM); + javaVM->DestroyJavaVM(); }