ijkplayer阅读笔记01-初始化操作

本节介绍ijkplayer播放库初始化部分,直接贴上流程伪代码如下:

IjkMediaPlayer_native_setup
{
   ijkmp_android_create(message_loop){
      mp->ffplayer->vout = SDL_VoutAndroid_CreateForAndroidSurface();{
        SDL_VoutAndroid_CreateForANativeWindow();{
           vout->create_overlay  = vout_create_overlay;{
              SDL_VoutAMediaCodec_CreateOverlay; or SDL_VoutFFmpeg_CreateOverlay;
           }
        }
        vout->display_overlay = voud_display_overlay;{
           SDL_VoutOverlayAMediaCodec_releaseFrame(overlay, NULL, true);
           Or SDL_Android_NativeWindow_display_l(native_window, overlay);
        }
      }
      mp->ffplayer->aout = SDL_AoutAndroid_CreateForAudioTrack();{
         aout->open_audio   = aout_open_audio;{
            aout_open_audio_n{
               SDL_CreateThreadEx(&opaque->_audio_tid, aout_thread);{
                  aout_thread_n{
                     while (!opaque->abort_request) {
                        audio_cblk(userdata, buffer, copy_size);{
                           sdl_audio_callback(void *opaque, Uint8 *stream, int len){
                              while (len > 0) {
                                 audio_size = audio_decode_frame(ffp);{
                                   af = frame_queue_peek_readable(&is->sampq)
                                   is->audio_buf = af->frame->data[0];
                                 }
                                 memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
                               }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
      mp->ffplayer->pipeline = ffpipeline_create_from_android(mp->ffplayer);{
         pipeline->func_destroy            = func_destroy;
         pipeline->func_open_video_decoder = func_open_video_decoder;
         {  
             if (opaque->mediacodec_enabled)
                node = ffpipenode_create_video_decoder_from_android_mediacodec(ffp);{
                   func_run_sync{
                      SDL_CreateThreadEx(enqueue_thread_func){
                          while (!q->abort_request) {
                             feed_input_buffer{ 
                                ffp_packet_queue_get_or_buffering
                                SDL_AMediaCodec_dequeueInputBuffer
                                input_buffer_ptr = SDL_AMediaCodec_getInputBuffer
                                memcpy(input_buffer_ptr, d->pkt_temp.data, copy_size);
                               SDL_AMediaCodec_queueInputBuffer
                             }
                          }
                      }
                      while{
                         drain_output_buffer
                      }
                   }
                }
             if (!node)
                 node = ffpipenode_create_video_decoder_from_ffplay(ffp);
                 {
                     func_run_sync{
                         ffp_video_thread(opaque->ffp);{
                            for (;;) {
                                get_video_frame(ffp, frame);
                                queue_picture
                            }
                         }
                     } 
                 }
          }
          pipeline->func_open_video_output  = func_open_video_output;{
             ffpipenode_create_video_output_from_android_mediacodec(ffp);
             node->func_run_sync = func_run_sync;{
                 ffp_video_refresh_thread(opaque->ffp);
             }
          }
      }
      ffpipeline_set_vout(mp->ffplayer->pipeline, mp->ffplayer->vout);
   }
   jni_set_media_player
}


你可能感兴趣的:(ffmpeg,android,ijkplayer)