├── .gitignore ├── LICENSE ├── README-en.md ├── README.md ├── build.gradle ├── constants.gradle ├── devlin.jks ├── dkplayer-java ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── xyz │ │ └── doikki │ │ └── videoplayer │ │ ├── controller │ │ ├── BaseVideoController.java │ │ ├── ControlWrapper.java │ │ ├── GestureVideoController.java │ │ ├── IControlComponent.java │ │ ├── IGestureComponent.java │ │ ├── IVideoController.java │ │ ├── MediaPlayerControl.java │ │ └── OrientationHelper.java │ │ ├── player │ │ ├── AbstractPlayer.java │ │ ├── AndroidMediaPlayer.java │ │ ├── AndroidMediaPlayerFactory.java │ │ ├── AudioFocusHelper.java │ │ ├── BaseVideoView.java │ │ ├── PlayerFactory.java │ │ ├── ProgressManager.java │ │ ├── VideoView.java │ │ ├── VideoViewConfig.java │ │ └── VideoViewManager.java │ │ ├── render │ │ ├── IRenderView.java │ │ ├── MeasureHelper.java │ │ ├── RenderViewFactory.java │ │ ├── TextureRenderView.java │ │ └── TextureRenderViewFactory.java │ │ └── util │ │ ├── CutoutUtil.java │ │ ├── L.java │ │ └── PlayerUtils.java │ └── res │ └── values │ └── attrs.xml ├── dkplayer-players ├── exo │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── xyz │ │ └── doikki │ │ └── videoplayer │ │ └── exo │ │ ├── ExoMediaPlayer.java │ │ ├── ExoMediaPlayerFactory.java │ │ └── ExoMediaSourceHelper.java └── ijk │ ├── .gitignore │ ├── build.gradle │ ├── proguard-rules.pro │ └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ ├── tv │ │ └── danmaku │ │ │ └── ijk │ │ │ └── media │ │ │ └── player │ │ │ ├── AbstractMediaPlayer.java │ │ │ ├── AndroidMediaPlayer.java │ │ │ ├── IMediaPlayer.java │ │ │ ├── ISurfaceTextureHolder.java │ │ │ ├── ISurfaceTextureHost.java │ │ │ ├── IjkLibLoader.java │ │ │ ├── IjkMediaCodecInfo.java │ │ │ ├── IjkMediaMeta.java │ │ │ ├── IjkMediaPlayer.java │ │ │ ├── IjkTimedText.java │ │ │ ├── MediaInfo.java │ │ │ ├── MediaPlayerProxy.java │ │ │ ├── TextureMediaPlayer.java │ │ │ ├── annotations │ │ │ ├── AccessedByNative.java │ │ │ └── CalledByNative.java │ │ │ ├── exceptions │ │ │ └── IjkMediaException.java │ │ │ ├── ffmpeg │ │ │ └── FFmpegApi.java │ │ │ ├── misc │ │ │ ├── AndroidMediaFormat.java │ │ │ ├── AndroidTrackInfo.java │ │ │ ├── IAndroidIO.java │ │ │ ├── IMediaDataSource.java │ │ │ ├── IMediaFormat.java │ │ │ ├── ITrackInfo.java │ │ │ ├── IjkMediaFormat.java │ │ │ └── IjkTrackInfo.java │ │ │ └── pragma │ │ │ ├── DebugLog.java │ │ │ └── Pragma.java │ └── xyz │ │ └── doikki │ │ └── videoplayer │ │ └── ijk │ │ ├── IjkPlayer.java │ │ ├── IjkPlayerFactory.java │ │ └── RawDataSourceProvider.java │ └── jniLibs │ ├── arm64-v8a │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ ├── armeabi-v7a │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ ├── armeabi │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ ├── x86 │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so │ └── x86_64 │ ├── libijkffmpeg.so │ ├── libijkplayer.so │ └── libijksdl.so ├── dkplayer-sample ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── assets │ ├── bitmap_overlay_video_processor_fragment.glsl │ ├── bitmap_overlay_video_processor_vertex.glsl │ ├── test.mp4 │ └── tiktok_data │ ├── ic_launcher-web.png │ ├── java │ └── xyz │ │ └── doikki │ │ └── dkplayer │ │ ├── activity │ │ ├── BaseActivity.java │ │ ├── CpuInfoActivity.java │ │ ├── MainActivity.kt │ │ ├── api │ │ │ ├── ParallelPlayActivity.java │ │ │ ├── PlayRawAssetsActivity.java │ │ │ ├── PlayerActivity.kt │ │ │ └── PlayerActivityJava.java │ │ ├── extend │ │ │ ├── ADActivity.java │ │ │ ├── CacheActivity.java │ │ │ ├── CustomExoPlayerActivity.java │ │ │ ├── CustomIjkPlayerActivity.java │ │ │ ├── DanmakuActivity.java │ │ │ ├── DefinitionPlayerActivity.java │ │ │ ├── FullScreenActivity.java │ │ │ ├── PadActivity.java │ │ │ └── PlayListActivity.java │ │ ├── list │ │ │ ├── DetailActivity.java │ │ │ └── tiktok │ │ │ │ ├── OnViewPagerListener.java │ │ │ │ ├── TikTok2Activity.java │ │ │ │ ├── TikTok3Activity.java │ │ │ │ ├── TikTokActivity.java │ │ │ │ └── ViewPagerLayoutManager.java │ │ └── pip │ │ │ ├── AndroidOPiPActivity.java │ │ │ ├── PIPActivity.java │ │ │ ├── PIPListActivity.java │ │ │ └── TinyScreenActivity.java │ │ ├── adapter │ │ ├── ListPagerAdapter.java │ │ ├── TikTokAdapter.java │ │ ├── TikTokListAdapter.java │ │ ├── Tiktok2Adapter.java │ │ ├── Tiktok3Adapter.java │ │ ├── VideoListViewAdapter.java │ │ ├── VideoRecyclerViewAdapter.java │ │ └── listener │ │ │ ├── OnItemChildClickListener.java │ │ │ └── OnItemClickListener.java │ │ ├── app │ │ └── MyApplication.java │ │ ├── bean │ │ ├── TiktokBean.java │ │ └── VideoBean.java │ │ ├── fragment │ │ ├── BaseFragment.java │ │ ├── list │ │ │ ├── ListViewFragment.java │ │ │ ├── RecyclerViewAutoPlayFragment.java │ │ │ ├── RecyclerViewFragment.java │ │ │ ├── RecyclerViewPortraitFragment.java │ │ │ ├── SeamlessPlayFragment.java │ │ │ └── TikTokListFragment.java │ │ └── main │ │ │ ├── ApiFragment.java │ │ │ ├── ExtensionFragment.java │ │ │ ├── ListFragment.java │ │ │ └── PipFragment.java │ │ ├── util │ │ ├── DataUtil.java │ │ ├── IntentKeys.java │ │ ├── PIPManager.java │ │ ├── ProgressManagerImpl.java │ │ ├── Tag.java │ │ ├── Utils.java │ │ └── cache │ │ │ ├── PreloadManager.java │ │ │ ├── PreloadTask.java │ │ │ └── ProxyVideoCacheManager.java │ │ └── widget │ │ ├── CenteredImageSpan.java │ │ ├── FloatView.java │ │ ├── VerticalViewPager.java │ │ ├── component │ │ ├── AdControlView.java │ │ ├── DebugInfoView.java │ │ ├── DefinitionControlView.java │ │ ├── MyDanmakuView.java │ │ ├── PipControlView.java │ │ ├── PlayerMonitor.java │ │ └── TikTokView.java │ │ ├── controller │ │ ├── FloatController.java │ │ ├── PortraitWhenFullScreenController.java │ │ └── TikTokController.java │ │ ├── player │ │ ├── CustomExoMediaPlayer.java │ │ └── CustomIjkMediaPlayer.java │ │ ├── render │ │ ├── SurfaceRenderView.java │ │ ├── SurfaceRenderViewFactory.java │ │ ├── TikTokRenderView.java │ │ ├── TikTokRenderViewFactory.java │ │ ├── gl │ │ │ ├── BitmapOverlayVideoProcessor.java │ │ │ ├── GLSurfaceRenderView.java │ │ │ └── GLSurfaceRenderViewFactory.java │ │ └── gl2 │ │ │ ├── EglUtil.java │ │ │ ├── GLFrameBufferObjectRenderer.java │ │ │ ├── GLFramebufferObject.java │ │ │ ├── GLSurfaceRenderView2.java │ │ │ ├── GLSurfaceTexture.java │ │ │ ├── GLVideoRenderer.java │ │ │ ├── Resolution.java │ │ │ ├── chooser │ │ │ └── GLConfigChooser.java │ │ │ ├── contextfactory │ │ │ └── GLContextFactory.java │ │ │ └── filter │ │ │ ├── GlBilateralFilter.java │ │ │ ├── GlBoxBlurFilter.java │ │ │ ├── GlBrightnessFilter.java │ │ │ ├── GlBulgeDistortionFilter.java │ │ │ ├── GlCGAColorspaceFilter.java │ │ │ ├── GlContrastFilter.java │ │ │ ├── GlCrosshatchFilter.java │ │ │ ├── GlExposureFilter.java │ │ │ ├── GlFilter.java │ │ │ ├── GlFilterGroup.java │ │ │ ├── GlGammaFilter.java │ │ │ ├── GlGaussianBlurFilter.java │ │ │ ├── GlGrayScaleFilter.java │ │ │ ├── GlHalftoneFilter.java │ │ │ ├── GlHazeFilter.java │ │ │ ├── GlHighlightShadowFilter.java │ │ │ ├── GlHueFilter.java │ │ │ ├── GlInvertFilter.java │ │ │ ├── GlLookUpTableFilter.java │ │ │ ├── GlLuminanceFilter.java │ │ │ ├── GlLuminanceThresholdFilter.java │ │ │ ├── GlMonochromeFilter.java │ │ │ ├── GlOpacityFilter.java │ │ │ ├── GlOverlayFilter.java │ │ │ ├── GlPixelationFilter.java │ │ │ ├── GlPosterizeFilter.java │ │ │ ├── GlPreviewFilter.java │ │ │ ├── GlRGBFilter.java │ │ │ ├── GlSaturationFilter.java │ │ │ ├── GlSepiaFilter.java │ │ │ ├── GlSharpenFilter.java │ │ │ ├── GlSolarizeFilter.java │ │ │ ├── GlSphereRefractionFilter.java │ │ │ ├── GlSwirlFilter.java │ │ │ ├── GlThreex3TextureSamplingFilter.java │ │ │ ├── GlToneCurveFilter.java │ │ │ ├── GlToneFilter.java │ │ │ ├── GlVibranceFilter.java │ │ │ ├── GlVignetteFilter.java │ │ │ ├── GlWatermarkFilter.java │ │ │ ├── GlWeakPixelInclusionFilter.java │ │ │ ├── GlWhiteBalanceFilter.java │ │ │ └── GlZoomBlurFilter.java │ │ └── videoview │ │ ├── DanmukuVideoView.java │ │ ├── ExoVideoView.java │ │ └── IjkVideoView.java │ └── res │ ├── anim │ ├── anim_alpha_in.xml │ ├── anim_alpha_out.xml │ ├── anim_float_window_enter.xml │ ├── anim_float_window_exit.xml │ ├── anim_slide_bottom_in.xml │ ├── anim_slide_bottom_out.xml │ ├── anim_slide_top_in.xml │ └── anim_slide_top_out.xml │ ├── drawable-hdpi │ ├── ic_tab_extension.png │ ├── ic_tab_functions.png │ ├── ic_tab_list.png │ └── ic_tab_picture_in_picture.png │ ├── drawable-mdpi │ ├── ic_tab_extension.png │ ├── ic_tab_functions.png │ ├── ic_tab_list.png │ └── ic_tab_picture_in_picture.png │ ├── drawable-xhdpi │ ├── ic_tab_extension.png │ ├── ic_tab_functions.png │ ├── ic_tab_list.png │ └── ic_tab_picture_in_picture.png │ ├── drawable-xxhdpi │ ├── ic_tab_extension.png │ ├── ic_tab_functions.png │ ├── ic_tab_list.png │ └── ic_tab_picture_in_picture.png │ ├── drawable-xxxhdpi │ ├── ic_tab_extension.png │ ├── ic_tab_functions.png │ ├── ic_tab_list.png │ └── ic_tab_picture_in_picture.png │ ├── drawable │ ├── selector_mute_icon.xml │ ├── shape_ad_bg.xml │ └── shape_float_window_background.xml │ ├── layout │ ├── activity_custom_exo_player.xml │ ├── activity_custom_ijk_player.xml │ ├── activity_danmaku_player.xml │ ├── activity_detail.xml │ ├── activity_layout_common.xml │ ├── activity_main.xml │ ├── activity_pad.xml │ ├── activity_parallel_play.xml │ ├── activity_pip.xml │ ├── activity_pip_android_o.xml │ ├── activity_play_raw_assets.xml │ ├── activity_player.xml │ ├── activity_tiktok.xml │ ├── activity_tiktok2.xml │ ├── activity_tiktok3.xml │ ├── fragment_api.xml │ ├── fragment_extension.xml │ ├── fragment_list.xml │ ├── fragment_list_view.xml │ ├── fragment_pip.xml │ ├── fragment_recycler_view.xml │ ├── fragment_tiktok_list.xml │ ├── item_tik_tok.xml │ ├── item_tiktok_list.xml │ ├── item_video.xml │ ├── layout_ad_control_view.xml │ ├── layout_definition_control_view.xml │ ├── layout_float_controller.xml │ ├── layout_rate_item.xml │ ├── layout_rate_pop.xml │ └── layout_tiktok_controller.xml │ ├── menu │ ├── main_menu.xml │ ├── main_navigation_items.xml │ └── tiktok_impl_menu.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── raw │ └── movie │ ├── values-en │ └── strings.xml │ ├── values │ ├── colors.xml │ ├── dimens.xml │ ├── ic_launcher_background.xml │ ├── ids.xml │ ├── strings.xml │ └── styles.xml │ └── xml │ └── network_security_config.xml ├── dkplayer-ui ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── xyz │ │ └── doikki │ │ └── videocontroller │ │ ├── StandardVideoController.java │ │ └── component │ │ ├── CompleteView.java │ │ ├── ErrorView.java │ │ ├── GestureView.java │ │ ├── LiveControlView.java │ │ ├── PrepareView.java │ │ ├── TitleView.java │ │ └── VodControlView.java │ └── res │ ├── drawable-hdpi │ ├── dkplayer_ic_action_arrow_back.png │ ├── dkplayer_ic_action_autorenew.png │ ├── dkplayer_ic_action_battery.png │ ├── dkplayer_ic_action_battery_10.png │ ├── dkplayer_ic_action_battery_20.png │ ├── dkplayer_ic_action_battery_30.png │ ├── dkplayer_ic_action_battery_40.png │ ├── dkplayer_ic_action_battery_50.png │ ├── dkplayer_ic_action_battery_60.png │ ├── dkplayer_ic_action_battery_70.png │ ├── dkplayer_ic_action_battery_80.png │ ├── dkplayer_ic_action_battery_90.png │ ├── dkplayer_ic_action_brightness.png │ ├── dkplayer_ic_action_close.png │ ├── dkplayer_ic_action_fast_forward.png │ ├── dkplayer_ic_action_fast_rewind.png │ ├── dkplayer_ic_action_fullscreen.png │ ├── dkplayer_ic_action_fullscreen_exit.png │ ├── dkplayer_ic_action_lock_close.png │ ├── dkplayer_ic_action_lock_open.png │ ├── dkplayer_ic_action_pause.png │ ├── dkplayer_ic_action_play_arrow.png │ ├── dkplayer_ic_action_replay.png │ ├── dkplayer_ic_action_volume_off.png │ └── dkplayer_ic_action_volume_up.png │ ├── drawable-mdpi │ ├── dkplayer_ic_action_arrow_back.png │ ├── dkplayer_ic_action_autorenew.png │ ├── dkplayer_ic_action_battery.png │ ├── dkplayer_ic_action_battery_10.png │ ├── dkplayer_ic_action_battery_20.png │ ├── dkplayer_ic_action_battery_30.png │ ├── dkplayer_ic_action_battery_40.png │ ├── dkplayer_ic_action_battery_50.png │ ├── dkplayer_ic_action_battery_60.png │ ├── dkplayer_ic_action_battery_70.png │ ├── dkplayer_ic_action_battery_80.png │ ├── dkplayer_ic_action_battery_90.png │ ├── dkplayer_ic_action_brightness.png │ ├── dkplayer_ic_action_close.png │ ├── dkplayer_ic_action_fast_forward.png │ ├── dkplayer_ic_action_fast_rewind.png │ ├── dkplayer_ic_action_fullscreen.png │ ├── dkplayer_ic_action_fullscreen_exit.png │ ├── dkplayer_ic_action_lock_close.png │ ├── dkplayer_ic_action_lock_open.png │ ├── dkplayer_ic_action_pause.png │ ├── dkplayer_ic_action_play_arrow.png │ ├── dkplayer_ic_action_replay.png │ ├── dkplayer_ic_action_volume_off.png │ └── dkplayer_ic_action_volume_up.png │ ├── drawable-xhdpi │ ├── dkplayer_ic_action_arrow_back.png │ ├── dkplayer_ic_action_autorenew.png │ ├── dkplayer_ic_action_battery.png │ ├── dkplayer_ic_action_battery_10.png │ ├── dkplayer_ic_action_battery_20.png │ ├── dkplayer_ic_action_battery_30.png │ ├── dkplayer_ic_action_battery_40.png │ ├── dkplayer_ic_action_battery_50.png │ ├── dkplayer_ic_action_battery_60.png │ ├── dkplayer_ic_action_battery_70.png │ ├── dkplayer_ic_action_battery_80.png │ ├── dkplayer_ic_action_battery_90.png │ ├── dkplayer_ic_action_brightness.png │ ├── dkplayer_ic_action_close.png │ ├── dkplayer_ic_action_fast_forward.png │ ├── dkplayer_ic_action_fast_rewind.png │ ├── dkplayer_ic_action_fullscreen.png │ ├── dkplayer_ic_action_fullscreen_exit.png │ ├── dkplayer_ic_action_lock_close.png │ ├── dkplayer_ic_action_lock_open.png │ ├── dkplayer_ic_action_pause.png │ ├── dkplayer_ic_action_play_arrow.png │ ├── dkplayer_ic_action_replay.png │ ├── dkplayer_ic_action_volume_off.png │ └── dkplayer_ic_action_volume_up.png │ ├── drawable-xxhdpi │ ├── dkplayer_ic_action_arrow_back.png │ ├── dkplayer_ic_action_autorenew.png │ ├── dkplayer_ic_action_battery.png │ ├── dkplayer_ic_action_battery_10.png │ ├── dkplayer_ic_action_battery_20.png │ ├── dkplayer_ic_action_battery_30.png │ ├── dkplayer_ic_action_battery_40.png │ ├── dkplayer_ic_action_battery_50.png │ ├── dkplayer_ic_action_battery_60.png │ ├── dkplayer_ic_action_battery_70.png │ ├── dkplayer_ic_action_battery_80.png │ ├── dkplayer_ic_action_battery_90.png │ ├── dkplayer_ic_action_brightness.png │ ├── dkplayer_ic_action_close.png │ ├── dkplayer_ic_action_fast_forward.png │ ├── dkplayer_ic_action_fast_rewind.png │ ├── dkplayer_ic_action_fullscreen.png │ ├── dkplayer_ic_action_fullscreen_exit.png │ ├── dkplayer_ic_action_lock_close.png │ ├── dkplayer_ic_action_lock_open.png │ ├── dkplayer_ic_action_pause.png │ ├── dkplayer_ic_action_play_arrow.png │ ├── dkplayer_ic_action_replay.png │ ├── dkplayer_ic_action_volume_off.png │ └── dkplayer_ic_action_volume_up.png │ ├── drawable-xxxhdpi │ ├── dkplayer_ic_action_arrow_back.png │ ├── dkplayer_ic_action_autorenew.png │ ├── dkplayer_ic_action_battery.png │ ├── dkplayer_ic_action_battery_10.png │ ├── dkplayer_ic_action_battery_20.png │ ├── dkplayer_ic_action_battery_30.png │ ├── dkplayer_ic_action_battery_40.png │ ├── dkplayer_ic_action_battery_50.png │ ├── dkplayer_ic_action_battery_60.png │ ├── dkplayer_ic_action_battery_70.png │ ├── dkplayer_ic_action_battery_80.png │ ├── dkplayer_ic_action_battery_90.png │ ├── dkplayer_ic_action_brightness.png │ ├── dkplayer_ic_action_close.png │ ├── dkplayer_ic_action_fast_forward.png │ ├── dkplayer_ic_action_fast_rewind.png │ ├── dkplayer_ic_action_fullscreen.png │ ├── dkplayer_ic_action_fullscreen_exit.png │ ├── dkplayer_ic_action_lock_close.png │ ├── dkplayer_ic_action_lock_open.png │ ├── dkplayer_ic_action_pause.png │ ├── dkplayer_ic_action_play_arrow.png │ ├── dkplayer_ic_action_replay.png │ ├── dkplayer_ic_action_volume_off.png │ └── dkplayer_ic_action_volume_up.png │ ├── drawable │ ├── dkplayer_battery_level.xml │ ├── dkplayer_layer_progress_bar.xml │ ├── dkplayer_progress_loading.xml │ ├── dkplayer_seekbar_thumb.xml │ ├── dkplayer_seekbar_thumb_normal.xml │ ├── dkplayer_seekbar_thumb_pressed.xml │ ├── dkplayer_selector_full_screen_button.xml │ ├── dkplayer_selector_lock_button.xml │ ├── dkplayer_selector_play_button.xml │ ├── dkplayer_shape_back_bg.xml │ ├── dkplayer_shape_play_bg.xml │ ├── dkplayer_shape_standard_controller_top_bg.xml │ ├── dkplayer_shape_stardard_controller_bottom_bg.xml │ └── dkplayer_shape_status_view_btn.xml │ ├── layout │ ├── dkplayer_layout_complete_view.xml │ ├── dkplayer_layout_error_view.xml │ ├── dkplayer_layout_gesture_control_view.xml │ ├── dkplayer_layout_live_control_view.xml │ ├── dkplayer_layout_prepare_view.xml │ ├── dkplayer_layout_standard_controller.xml │ ├── dkplayer_layout_title_view.xml │ └── dkplayer_layout_vod_control_view.xml │ ├── values-en │ └── strings.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ └── strings.xml ├── dkplayer-videocache ├── .gitignore ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── danikula │ └── videocache │ ├── ByteArrayCache.java │ ├── ByteArraySource.java │ ├── Cache.java │ ├── CacheListener.java │ ├── Config.java │ ├── GetRequest.java │ ├── HttpProxyCache.java │ ├── HttpProxyCacheServer.java │ ├── HttpProxyCacheServerClients.java │ ├── HttpUrlSource.java │ ├── IgnoreHostProxySelector.java │ ├── InterruptedProxyCacheException.java │ ├── Logger.java │ ├── Pinger.java │ ├── Preconditions.java │ ├── ProxyCache.java │ ├── ProxyCacheException.java │ ├── ProxyCacheUtils.java │ ├── Source.java │ ├── SourceInfo.java │ ├── StorageUtils.java │ ├── file │ ├── DiskUsage.java │ ├── FileCache.java │ ├── FileNameGenerator.java │ ├── Files.java │ ├── LruDiskUsage.java │ ├── Md5FileNameGenerator.java │ ├── TotalCountLruDiskUsage.java │ ├── TotalSizeLruDiskUsage.java │ └── UnlimitedDiskUsage.java │ ├── headers │ ├── EmptyHeadersInjector.java │ └── HeaderInjector.java │ └── sourcestorage │ ├── DatabaseSourceInfoStorage.java │ ├── NoSourceInfoStorage.java │ ├── SourceInfoStorage.java │ └── SourceInfoStorageFactory.java ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── other ├── module-lite.sh └── test.ffconcat ├── publish.gradle └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | /local.properties 3 | /build 4 | .idea/ 5 | .gradle -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext.kotlin_version = '1.6.21' 5 | repositories { 6 | google() 7 | mavenCentral() 8 | // mavenLocal() 9 | } 10 | dependencies { 11 | classpath 'com.android.tools.build:gradle:7.1.2' 12 | // maven publish tool 13 | classpath 'org.jetbrains.dokka:dokka-gradle-plugin:1.4.30' 14 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 15 | // NOTE: Do not place your application dependencies here; they belong 16 | // in the individual module build.gradle files 17 | } 18 | } 19 | 20 | allprojects { 21 | repositories { 22 | google() 23 | jcenter() 24 | mavenCentral() 25 | // mavenLocal() 26 | } 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | 33 | // 指定javadoc UTF-8格式 34 | task javadoc(type: Javadoc) { 35 | options.encoding = "utf-8" 36 | } 37 | -------------------------------------------------------------------------------- /constants.gradle: -------------------------------------------------------------------------------- 1 | project.ext { 2 | releaseVersion = '3.3.7' 3 | releaseVersionCode = 55 4 | 5 | minSdkVersion = 16 6 | targetSdkVersion = 31 7 | compileSdkVersion = 31 8 | buildToolsVersion = '33.0.0' 9 | 10 | exoPlayerVersion = '2.18.1' 11 | 12 | annotation = 'androidx.annotation:annotation:1.1.0' 13 | } -------------------------------------------------------------------------------- /devlin.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/devlin.jks -------------------------------------------------------------------------------- /dkplayer-java/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /dkplayer-java/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply from: '../constants.gradle' 3 | 4 | android { 5 | compileSdkVersion project.ext.compileSdkVersion 6 | buildToolsVersion project.ext.buildToolsVersion 7 | 8 | defaultConfig { 9 | minSdkVersion project.ext.minSdkVersion 10 | targetSdkVersion project.ext.targetSdkVersion 11 | } 12 | } 13 | 14 | dependencies { 15 | implementation fileTree(include: ['*.jar'], dir: 'libs') 16 | compileOnly project.ext.annotation 17 | } 18 | 19 | ext { 20 | PUBLISH_ARTIFACT_ID = 'dkplayer-java' 21 | } 22 | 23 | apply from: '../publish.gradle' -------------------------------------------------------------------------------- /dkplayer-java/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/controller/IGestureComponent.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.controller; 2 | 3 | public interface IGestureComponent extends IControlComponent { 4 | /** 5 | * 开始滑动 6 | */ 7 | void onStartSlide(); 8 | 9 | /** 10 | * 结束滑动 11 | */ 12 | void onStopSlide(); 13 | 14 | /** 15 | * 滑动调整进度 16 | * @param slidePosition 滑动进度 17 | * @param currentPosition 当前播放进度 18 | * @param duration 视频总长度 19 | */ 20 | void onPositionChange(int slidePosition, int currentPosition, int duration); 21 | 22 | /** 23 | * 滑动调整亮度 24 | * @param percent 亮度百分比 25 | */ 26 | void onBrightnessChange(int percent); 27 | 28 | /** 29 | * 滑动调整音量 30 | * @param percent 音量百分比 31 | */ 32 | void onVolumeChange(int percent); 33 | } 34 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/controller/IVideoController.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.controller; 2 | 3 | public interface IVideoController { 4 | 5 | /** 6 | * 开始控制视图自动隐藏倒计时 7 | */ 8 | void startFadeOut(); 9 | 10 | /** 11 | * 取消控制视图自动隐藏倒计时 12 | */ 13 | void stopFadeOut(); 14 | 15 | /** 16 | * 控制视图是否处于显示状态 17 | */ 18 | boolean isShowing(); 19 | 20 | /** 21 | * 设置锁定状态 22 | * @param locked 是否锁定 23 | */ 24 | void setLocked(boolean locked); 25 | 26 | /** 27 | * 是否处于锁定状态 28 | */ 29 | boolean isLocked(); 30 | 31 | /** 32 | * 开始刷新进度 33 | */ 34 | void startProgress(); 35 | 36 | /** 37 | * 停止刷新进度 38 | */ 39 | void stopProgress(); 40 | 41 | /** 42 | * 显示控制视图 43 | */ 44 | void hide(); 45 | 46 | /** 47 | * 隐藏控制视图 48 | */ 49 | void show(); 50 | 51 | /** 52 | * 是否需要适配刘海 53 | */ 54 | boolean hasCutout(); 55 | 56 | /** 57 | * 获取刘海的高度 58 | */ 59 | int getCutoutHeight(); 60 | } 61 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/controller/MediaPlayerControl.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.controller; 2 | 3 | import android.graphics.Bitmap; 4 | 5 | public interface MediaPlayerControl { 6 | 7 | void start(); 8 | 9 | void pause(); 10 | 11 | long getDuration(); 12 | 13 | long getCurrentPosition(); 14 | 15 | void seekTo(long pos); 16 | 17 | boolean isPlaying(); 18 | 19 | int getBufferedPercentage(); 20 | 21 | void startFullScreen(); 22 | 23 | void stopFullScreen(); 24 | 25 | boolean isFullScreen(); 26 | 27 | void setMute(boolean isMute); 28 | 29 | boolean isMute(); 30 | 31 | void setScreenScaleType(int screenScaleType); 32 | 33 | void setSpeed(float speed); 34 | 35 | float getSpeed(); 36 | 37 | long getTcpSpeed(); 38 | 39 | void replay(boolean resetPosition); 40 | 41 | void setMirrorRotation(boolean enable); 42 | 43 | Bitmap doScreenShot(); 44 | 45 | int[] getVideoSize(); 46 | 47 | void setRotation(float rotation); 48 | 49 | void startTinyScreen(); 50 | 51 | void stopTinyScreen(); 52 | 53 | boolean isTinyScreen(); 54 | } -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/controller/OrientationHelper.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.controller; 2 | 3 | import android.content.Context; 4 | import android.view.OrientationEventListener; 5 | 6 | /** 7 | * 设备方向监听 8 | */ 9 | public class OrientationHelper extends OrientationEventListener { 10 | 11 | private long mLastTime; 12 | 13 | private OnOrientationChangeListener mOnOrientationChangeListener; 14 | 15 | public OrientationHelper(Context context) { 16 | super(context); 17 | } 18 | 19 | @Override 20 | public void onOrientationChanged(int orientation) { 21 | long currentTime = System.currentTimeMillis(); 22 | if (currentTime - mLastTime < 300) return;//300毫秒检测一次 23 | if (mOnOrientationChangeListener != null) { 24 | mOnOrientationChangeListener.onOrientationChanged(orientation); 25 | } 26 | mLastTime = currentTime; 27 | } 28 | 29 | 30 | public interface OnOrientationChangeListener { 31 | void onOrientationChanged(int orientation); 32 | } 33 | 34 | public void setOnOrientationChangeListener(OnOrientationChangeListener onOrientationChangeListener) { 35 | mOnOrientationChangeListener = onOrientationChangeListener; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/player/AndroidMediaPlayerFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.player; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 创建{@link AndroidMediaPlayer}的工厂类,不推荐,系统的MediaPlayer兼容性较差,建议使用IjkPlayer或者ExoPlayer 7 | */ 8 | public class AndroidMediaPlayerFactory extends PlayerFactory { 9 | 10 | public static AndroidMediaPlayerFactory create() { 11 | return new AndroidMediaPlayerFactory(); 12 | } 13 | 14 | @Override 15 | public AndroidMediaPlayer createPlayer(Context context) { 16 | return new AndroidMediaPlayer(context); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/player/PlayerFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.player; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 此接口使用方法: 7 | * 1.继承{@link AbstractPlayer}扩展自己的播放器。 8 | * 2.继承此接口并实现{@link #createPlayer(Context)},返回步骤1中的播放器。 9 | * 可参照{@link AndroidMediaPlayer}和{@link AndroidMediaPlayerFactory}的实现。 10 | */ 11 | public abstract class PlayerFactory

{ 12 | 13 | public abstract P createPlayer(Context context); 14 | } 15 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/player/ProgressManager.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.player; 2 | 3 | /** 4 | * 播放进度管理器,继承此接口实现自己的进度管理器。 5 | */ 6 | public abstract class ProgressManager { 7 | 8 | /** 9 | * 此方法用于实现保存进度的逻辑 10 | * @param url 播放地址 11 | * @param progress 播放进度 12 | */ 13 | public abstract void saveProgress(String url, long progress); 14 | 15 | /** 16 | * 此方法用于实现获取保存的进度的逻辑 17 | * @param url 播放地址 18 | * @return 保存的播放进度 19 | */ 20 | public abstract long getSavedProgress(String url); 21 | 22 | } 23 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/player/VideoView.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.player; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import androidx.annotation.NonNull; 7 | import androidx.annotation.Nullable; 8 | 9 | 10 | /** 11 | * 可播放在线和本地url 12 | * Created by Doikki on 2022/7/18. 13 | */ 14 | public class VideoView extends BaseVideoView { 15 | public VideoView(@NonNull Context context) { 16 | super(context); 17 | } 18 | 19 | public VideoView(@NonNull Context context, @Nullable AttributeSet attrs) { 20 | super(context, attrs); 21 | } 22 | 23 | public VideoView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 24 | super(context, attrs, defStyleAttr); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/render/IRenderView.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.render; 2 | 3 | import android.graphics.Bitmap; 4 | import android.view.View; 5 | 6 | import androidx.annotation.NonNull; 7 | 8 | import xyz.doikki.videoplayer.player.AbstractPlayer; 9 | 10 | public interface IRenderView { 11 | 12 | /** 13 | * 关联AbstractPlayer 14 | */ 15 | void attachToPlayer(@NonNull AbstractPlayer player); 16 | 17 | /** 18 | * 设置视频宽高 19 | * @param videoWidth 宽 20 | * @param videoHeight 高 21 | */ 22 | void setVideoSize(int videoWidth, int videoHeight); 23 | 24 | /** 25 | * 设置视频旋转角度 26 | * @param degree 角度值 27 | */ 28 | void setVideoRotation(int degree); 29 | 30 | /** 31 | * 设置screen scale type 32 | * @param scaleType 类型 33 | */ 34 | void setScaleType(int scaleType); 35 | 36 | /** 37 | * 获取真实的RenderView 38 | */ 39 | View getView(); 40 | 41 | /** 42 | * 截图 43 | */ 44 | Bitmap doScreenShot(); 45 | 46 | /** 47 | * 释放资源 48 | */ 49 | void release(); 50 | 51 | } -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/render/RenderViewFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.render; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 此接口用于扩展自己的渲染View。使用方法如下: 7 | * 1.继承IRenderView实现自己的渲染View。 8 | * 2.重写createRenderView返回步骤1的渲染View。 9 | * 可参考{@link TextureRenderView}和{@link TextureRenderViewFactory}的实现。 10 | */ 11 | public abstract class RenderViewFactory { 12 | 13 | public abstract IRenderView createRenderView(Context context); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/render/TextureRenderViewFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.render; 2 | 3 | import android.content.Context; 4 | 5 | public class TextureRenderViewFactory extends RenderViewFactory { 6 | 7 | public static TextureRenderViewFactory create() { 8 | return new TextureRenderViewFactory(); 9 | } 10 | 11 | @Override 12 | public IRenderView createRenderView(Context context) { 13 | return new TextureRenderView(context); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/java/xyz/doikki/videoplayer/util/L.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.util; 2 | 3 | import android.util.Log; 4 | 5 | import xyz.doikki.videoplayer.player.VideoViewManager; 6 | 7 | /** 8 | * 日志类 9 | * Created by Doikki on 2017/6/5. 10 | */ 11 | 12 | public final class L { 13 | 14 | private L() { 15 | } 16 | 17 | private static final String TAG = "DKPlayer"; 18 | 19 | private static boolean isDebug = VideoViewManager.getConfig().mIsEnableLog; 20 | 21 | 22 | public static void d(String msg) { 23 | if (isDebug) { 24 | Log.d(TAG, msg); 25 | } 26 | } 27 | 28 | public static void e(String msg) { 29 | if (isDebug) { 30 | Log.e(TAG, msg); 31 | } 32 | } 33 | 34 | public static void i(String msg) { 35 | if (isDebug) { 36 | Log.i(TAG, msg); 37 | } 38 | } 39 | 40 | public static void w(String msg) { 41 | if (isDebug) { 42 | Log.w(TAG, msg); 43 | } 44 | } 45 | 46 | public static void setDebug(boolean isDebug) { 47 | L.isDebug = isDebug; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /dkplayer-java/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /dkplayer-players/exo/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /dkplayer-players/exo/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply from: '../../constants.gradle' 3 | 4 | android { 5 | compileSdkVersion project.ext.compileSdkVersion 6 | buildToolsVersion project.ext.buildToolsVersion 7 | 8 | defaultConfig { 9 | minSdkVersion project.ext.minSdkVersion 10 | targetSdkVersion project.ext.targetSdkVersion 11 | } 12 | compileOptions { 13 | sourceCompatibility JavaVersion.VERSION_1_8 14 | targetCompatibility JavaVersion.VERSION_1_8 15 | } 16 | } 17 | 18 | dependencies { 19 | implementation fileTree(include: ['*.jar'], dir: 'libs') 20 | implementation project(':dkplayer-java') 21 | api "com.google.android.exoplayer:exoplayer-core:$project.exoPlayerVersion" 22 | api "com.google.android.exoplayer:exoplayer-dash:$project.exoPlayerVersion" 23 | api "com.google.android.exoplayer:exoplayer-hls:$project.exoPlayerVersion" 24 | api "com.google.android.exoplayer:exoplayer-rtsp:$project.exoPlayerVersion" 25 | api "com.google.android.exoplayer:extension-rtmp:$project.exoPlayerVersion" 26 | } 27 | 28 | ext { 29 | PUBLISH_ARTIFACT_ID = 'player-exo' 30 | } 31 | 32 | apply from: '../../publish.gradle' -------------------------------------------------------------------------------- /dkplayer-players/exo/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /dkplayer-players/exo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /dkplayer-players/exo/src/main/java/xyz/doikki/videoplayer/exo/ExoMediaPlayerFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.exo; 2 | 3 | import android.content.Context; 4 | 5 | import xyz.doikki.videoplayer.player.PlayerFactory; 6 | 7 | public class ExoMediaPlayerFactory extends PlayerFactory { 8 | 9 | public static ExoMediaPlayerFactory create() { 10 | return new ExoMediaPlayerFactory(); 11 | } 12 | 13 | @Override 14 | public ExoMediaPlayer createPlayer(Context context) { 15 | return new ExoMediaPlayer(context); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply from: '../../constants.gradle' 3 | 4 | android { 5 | compileSdkVersion project.ext.compileSdkVersion 6 | buildToolsVersion project.ext.buildToolsVersion 7 | 8 | defaultConfig { 9 | minSdkVersion project.ext.minSdkVersion 10 | targetSdkVersion project.ext.targetSdkVersion 11 | } 12 | } 13 | 14 | dependencies { 15 | implementation fileTree(include: ['*.jar'], dir: 'libs') 16 | compileOnly project(':dkplayer-java') 17 | } 18 | 19 | ext { 20 | PUBLISH_ARTIFACT_ID = 'player-ijk' 21 | } 22 | 23 | apply from: '../../publish.gradle' -------------------------------------------------------------------------------- /dkplayer-players/ijk/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/ISurfaceTextureHolder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Bilibili 3 | * Copyright (C) 2015 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player; 19 | 20 | import android.graphics.SurfaceTexture; 21 | 22 | public interface ISurfaceTextureHolder { 23 | void setSurfaceTexture(SurfaceTexture surfaceTexture); 24 | 25 | SurfaceTexture getSurfaceTexture(); 26 | 27 | void setSurfaceTextureHost(ISurfaceTextureHost surfaceTextureHost); 28 | } 29 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/ISurfaceTextureHost.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Bilibili 3 | * Copyright (C) 2015 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player; 19 | 20 | import android.graphics.SurfaceTexture; 21 | 22 | public interface ISurfaceTextureHost { 23 | void releaseSurfaceTexture(SurfaceTexture surfaceTexture); 24 | } 25 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/IjkLibLoader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013-2014 Bilibili 3 | * Copyright (C) 2013-2014 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player; 19 | 20 | public interface IjkLibLoader { 21 | void loadLibrary(String libName) throws UnsatisfiedLinkError, 22 | SecurityException; 23 | } 24 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/IjkTimedText.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Zheng Yuan 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package tv.danmaku.ijk.media.player; 18 | 19 | import android.graphics.Rect; 20 | import java.lang.String; 21 | 22 | public final class IjkTimedText { 23 | 24 | private Rect mTextBounds = null; 25 | private String mTextChars = null; 26 | 27 | public IjkTimedText(Rect bounds, String text) { 28 | mTextBounds = bounds; 29 | mTextChars = text; 30 | } 31 | 32 | public Rect getBounds() { 33 | return mTextBounds; 34 | } 35 | 36 | public String getText() { 37 | return mTextChars; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/MediaInfo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013-2014 Bilibili 3 | * Copyright (C) 2013-2014 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player; 19 | 20 | public class MediaInfo { 21 | public String mMediaPlayerName; 22 | 23 | public String mVideoDecoder; 24 | public String mVideoDecoderImpl; 25 | 26 | public String mAudioDecoder; 27 | public String mAudioDecoderImpl; 28 | 29 | public IjkMediaMeta mMeta; 30 | } 31 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/annotations/AccessedByNative.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013-2014 Bilibili 3 | * Copyright (C) 2013-2014 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player.annotations; 19 | 20 | import java.lang.annotation.ElementType; 21 | import java.lang.annotation.Retention; 22 | import java.lang.annotation.RetentionPolicy; 23 | import java.lang.annotation.Target; 24 | 25 | /** 26 | * is used by the JNI generator to create the necessary JNI 27 | * bindings and expose this method to native code. 28 | */ 29 | @Target(ElementType.FIELD) 30 | @Retention(RetentionPolicy.CLASS) 31 | public @interface AccessedByNative { 32 | } -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/annotations/CalledByNative.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013-2014 Bilibili 3 | * Copyright (C) 2013-2014 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player.annotations; 19 | 20 | import java.lang.annotation.ElementType; 21 | import java.lang.annotation.Retention; 22 | import java.lang.annotation.RetentionPolicy; 23 | import java.lang.annotation.Target; 24 | 25 | /** 26 | * is used by the JNI generator to create the necessary JNI 27 | * bindings and expose this method to native code. 28 | */ 29 | @Target(ElementType.METHOD) 30 | @Retention(RetentionPolicy.CLASS) 31 | public @interface CalledByNative { 32 | /* 33 | * If present, tells which inner class the method belongs to. 34 | */ 35 | String value() default ""; 36 | } -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/exceptions/IjkMediaException.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013-2014 Bilibili 3 | * Copyright (C) 2013-2014 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player.exceptions; 19 | 20 | public class IjkMediaException extends Exception { 21 | private static final long serialVersionUID = 7234796519009099506L; 22 | } 23 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/ffmpeg/FFmpegApi.java: -------------------------------------------------------------------------------- 1 | package tv.danmaku.ijk.media.player.ffmpeg; 2 | 3 | public class FFmpegApi { 4 | public static native String av_base64_encode(byte in[]); 5 | } 6 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/misc/IAndroidIO.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2016 Bilibili 3 | * Copyright (C) 2016 Raymond Zheng 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player.misc; 19 | 20 | import java.io.IOException; 21 | 22 | @SuppressWarnings("RedundantThrows") 23 | public interface IAndroidIO { 24 | int open(String url) throws IOException; 25 | int read(byte[] buffer, int size) throws IOException; 26 | long seek(long offset, int whence) throws IOException; 27 | int close() throws IOException; 28 | } 29 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/misc/IMediaDataSource.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Bilibili 3 | * Copyright (C) 2015 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player.misc; 19 | 20 | import java.io.IOException; 21 | 22 | @SuppressWarnings("RedundantThrows") 23 | public interface IMediaDataSource { 24 | int readAt(long position, byte[] buffer, int offset, int size) throws IOException; 25 | 26 | long getSize() throws IOException; 27 | 28 | void close() throws IOException; 29 | } 30 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/misc/IMediaFormat.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Bilibili 3 | * Copyright (C) 2015 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player.misc; 19 | 20 | public interface IMediaFormat { 21 | // Common keys 22 | String KEY_MIME = "mime"; 23 | 24 | // Video Keys 25 | String KEY_WIDTH = "width"; 26 | String KEY_HEIGHT = "height"; 27 | 28 | String getString(String name); 29 | 30 | int getInteger(String name); 31 | } 32 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/misc/ITrackInfo.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2015 Bilibili 3 | * Copyright (C) 2015 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | package tv.danmaku.ijk.media.player.misc; 19 | 20 | public interface ITrackInfo { 21 | int MEDIA_TRACK_TYPE_AUDIO = 2; 22 | int MEDIA_TRACK_TYPE_METADATA = 5; 23 | int MEDIA_TRACK_TYPE_SUBTITLE = 4; 24 | int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; 25 | int MEDIA_TRACK_TYPE_UNKNOWN = 0; 26 | int MEDIA_TRACK_TYPE_VIDEO = 1; 27 | 28 | IMediaFormat getFormat(); 29 | 30 | String getLanguage(); 31 | 32 | int getTrackType(); 33 | 34 | String getInfoInline(); 35 | } 36 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/tv/danmaku/ijk/media/player/pragma/Pragma.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (C) 2013 Bilibili 3 | * Copyright (C) 2013 Zhang Rui 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | package tv.danmaku.ijk.media.player.pragma; 18 | 19 | /*- 20 | * configurated by app project 21 | */ 22 | public class Pragma { 23 | public static final boolean ENABLE_VERBOSE = true; 24 | } 25 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/java/xyz/doikki/videoplayer/ijk/IjkPlayerFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.videoplayer.ijk; 2 | 3 | import android.content.Context; 4 | 5 | import xyz.doikki.videoplayer.player.PlayerFactory; 6 | 7 | public class IjkPlayerFactory extends PlayerFactory { 8 | 9 | public static IjkPlayerFactory create() { 10 | return new IjkPlayerFactory(); 11 | } 12 | 13 | @Override 14 | public IjkPlayer createPlayer(Context context) { 15 | return new IjkPlayer(context); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/arm64-v8a/libijkffmpeg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/arm64-v8a/libijkffmpeg.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/arm64-v8a/libijkplayer.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/arm64-v8a/libijkplayer.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/arm64-v8a/libijksdl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/arm64-v8a/libijksdl.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/armeabi-v7a/libijkffmpeg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/armeabi-v7a/libijkffmpeg.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/armeabi-v7a/libijkplayer.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/armeabi-v7a/libijkplayer.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/armeabi-v7a/libijksdl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/armeabi-v7a/libijksdl.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/armeabi/libijkffmpeg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/armeabi/libijkffmpeg.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/armeabi/libijkplayer.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/armeabi/libijkplayer.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/armeabi/libijksdl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/armeabi/libijksdl.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/x86/libijkffmpeg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/x86/libijkffmpeg.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/x86/libijkplayer.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/x86/libijkplayer.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/x86/libijksdl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/x86/libijksdl.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/x86_64/libijkffmpeg.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/x86_64/libijkffmpeg.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/x86_64/libijkplayer.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/x86_64/libijkplayer.so -------------------------------------------------------------------------------- /dkplayer-players/ijk/src/main/jniLibs/x86_64/libijksdl.so: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-players/ijk/src/main/jniLibs/x86_64/libijksdl.so -------------------------------------------------------------------------------- /dkplayer-sample/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /dkplayer-sample/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | 27 | -keep class tv.danmaku.ijk.** { *; } 28 | -dontwarn tv.danmaku.ijk.** 29 | -keep class xyz.doikki.videoplayer.** { *; } 30 | -dontwarn xyz.doikki.videoplayer.** 31 | 32 | -keep class com.google.android.exoplayer2.** { *; } 33 | -dontwarn com.google.android.exoplayer2.** 34 | 35 | -keep class com.aplayer.** { *; } 36 | -dontwarn com.aplayer.** 37 | 38 | -dontwarn com.yanzhenjie.permission.** 39 | 40 | -keep class android.support.** { *; } 41 | 42 | -keep class com.bumptech.glide.** { *; } 43 | 44 | -keep class xyz.doikki.dkplayer.bean.** { *; } -------------------------------------------------------------------------------- /dkplayer-sample/src/main/assets/bitmap_overlay_video_processor_fragment.glsl: -------------------------------------------------------------------------------- 1 | // Copyright 2020 The Android Open Source Project 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | #extension GL_OES_EGL_image_external : require 16 | precision mediump float; 17 | // External texture containing video decoder output. 18 | uniform samplerExternalOES uTexSampler0; 19 | // Texture containing the overlap bitmap. 20 | uniform sampler2D uTexSampler1; 21 | // Horizontal scaling factor for the overlap bitmap. 22 | uniform float uScaleX; 23 | // Vertical scaling factory for the overlap bitmap. 24 | uniform float uScaleY; 25 | varying vec2 vTexCoords; 26 | void main() { 27 | vec4 videoColor = texture2D(uTexSampler0, vTexCoords); 28 | vec4 overlayColor = texture2D(uTexSampler1, 29 | vec2(vTexCoords.x * uScaleX, 30 | vTexCoords.y * uScaleY)); 31 | // Blend the video decoder output and the overlay bitmap. 32 | gl_FragColor = videoColor * (1.0 - overlayColor.a) 33 | + overlayColor * overlayColor.a; 34 | } 35 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/assets/bitmap_overlay_video_processor_vertex.glsl: -------------------------------------------------------------------------------- 1 | // Copyright 2020 The Android Open Source Project 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // http://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | attribute vec4 aFramePosition; 15 | attribute vec4 aTexCoords; 16 | uniform mat4 uTexTransform; 17 | varying vec2 vTexCoords; 18 | void main() { 19 | gl_Position = aFramePosition; 20 | vTexCoords = (uTexTransform * aTexCoords).xy; 21 | } 22 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/assets/test.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/assets/test.mp4 -------------------------------------------------------------------------------- /dkplayer-sample/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/activity/extend/CacheActivity.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.activity.extend; 2 | 3 | import com.danikula.videocache.HttpProxyCacheServer; 4 | import xyz.doikki.dkplayer.R; 5 | import xyz.doikki.dkplayer.activity.BaseActivity; 6 | import xyz.doikki.dkplayer.util.DataUtil; 7 | import xyz.doikki.dkplayer.util.cache.ProxyVideoCacheManager; 8 | import xyz.doikki.videocontroller.StandardVideoController; 9 | import xyz.doikki.videoplayer.player.VideoView; 10 | 11 | public class CacheActivity extends BaseActivity { 12 | 13 | @Override 14 | protected int getLayoutResId() { 15 | return R.layout.activity_layout_common; 16 | } 17 | 18 | @Override 19 | protected int getTitleResId() { 20 | return R.string.str_cache; 21 | } 22 | 23 | @Override 24 | protected void initView() { 25 | super.initView(); 26 | mVideoView = findViewById(R.id.video_view); 27 | HttpProxyCacheServer cacheServer = ProxyVideoCacheManager.getProxy(this); 28 | String proxyUrl = cacheServer.getProxyUrl(DataUtil.SAMPLE_URL); 29 | mVideoView.setUrl(proxyUrl); 30 | StandardVideoController controller = new StandardVideoController(this); 31 | controller.addDefaultControlComponent(getString(R.string.str_cache), false); 32 | mVideoView.setVideoController(controller); 33 | mVideoView.start(); 34 | 35 | //删除url对应默认缓存文件 36 | // ProxyVideoCacheManager.clearDefaultCache(this, URL); 37 | //清除缓存文件中的所有缓存 38 | // ProxyVideoCacheManager.clearAllCache(this); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/activity/list/tiktok/OnViewPagerListener.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.activity.list.tiktok; 2 | 3 | /** 4 | * Created by 钉某人 5 | * github: https://github.com/DingMouRen 6 | * email: naildingmouren@gmail.com 7 | * 用于ViewPagerLayoutManager的监听 8 | */ 9 | 10 | @Deprecated 11 | public interface OnViewPagerListener { 12 | 13 | /*初始化完成*/ 14 | void onInitComplete(); 15 | 16 | /*释放的监听*/ 17 | void onPageRelease(boolean isNext, int position); 18 | 19 | /*选中的监听以及判断是否滑动到底部*/ 20 | void onPageSelected(int position, boolean isBottom); 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/adapter/listener/OnItemChildClickListener.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.adapter.listener; 2 | 3 | public interface OnItemChildClickListener { 4 | void onItemChildClick(int position); 5 | } 6 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/adapter/listener/OnItemClickListener.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.adapter.listener; 2 | 3 | public interface OnItemClickListener { 4 | void onItemClick(int position); 5 | } -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/bean/VideoBean.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.bean; 2 | 3 | /** 4 | * Created by Doikki on 2017/6/1. 5 | */ 6 | 7 | public class VideoBean { 8 | 9 | private String title; 10 | private String url; 11 | private String thumb; 12 | 13 | public String getTitle() { 14 | return title; 15 | } 16 | 17 | public void setTitle(String title) { 18 | this.title = title; 19 | } 20 | 21 | public String getUrl() { 22 | return url; 23 | } 24 | 25 | public void setUrl(String url) { 26 | this.url = url; 27 | } 28 | 29 | public String getThumb() { 30 | return thumb; 31 | } 32 | 33 | public void setThumb(String thumb) { 34 | this.thumb = thumb; 35 | } 36 | 37 | public VideoBean(String title, String thumb, String url) { 38 | this.title = title; 39 | this.url = url; 40 | this.thumb = thumb; 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/util/IntentKeys.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.util; 2 | 3 | public class IntentKeys { 4 | 5 | public static final String URL = "url"; 6 | public static final String SEAMLESS_PLAY = "seamless_play"; 7 | public static final String TITLE = "title"; 8 | public static final String IS_LIVE = "isLive"; 9 | public static final String CUSTOM_RENDER = "custom_render"; 10 | } 11 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/util/ProgressManagerImpl.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.util; 2 | 3 | import android.text.TextUtils; 4 | 5 | import androidx.collection.LruCache; 6 | 7 | import xyz.doikki.videoplayer.player.ProgressManager; 8 | 9 | public class ProgressManagerImpl extends ProgressManager { 10 | 11 | //保存100条记录 12 | private static final LruCache mCache = new LruCache<>(100); 13 | 14 | @Override 15 | public void saveProgress(String url, long progress) { 16 | if (TextUtils.isEmpty(url)) return; 17 | if (progress == 0) { 18 | clearSavedProgressByUrl(url); 19 | return; 20 | } 21 | mCache.put(url.hashCode(), progress); 22 | } 23 | 24 | @Override 25 | public long getSavedProgress(String url) { 26 | if (TextUtils.isEmpty(url)) return 0; 27 | Long pro = mCache.get(url.hashCode()); 28 | if (pro == null) return 0; 29 | return pro; 30 | } 31 | 32 | public void clearAllSavedProgress() { 33 | mCache.evictAll(); 34 | } 35 | 36 | public void clearSavedProgressByUrl(String url) { 37 | mCache.remove(url.hashCode()); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/util/Tag.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.util; 2 | 3 | /** 4 | * 播放器标签 5 | */ 6 | public final class Tag { 7 | //列表播放 8 | public static final String LIST = "list"; 9 | //无缝播放 10 | public static final String SEAMLESS = "seamless"; 11 | //画中画 12 | public static final String PIP = "pip"; 13 | } 14 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/controller/FloatController.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.controller; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import androidx.annotation.NonNull; 7 | import androidx.annotation.Nullable; 8 | 9 | import xyz.doikki.dkplayer.widget.component.PipControlView; 10 | import xyz.doikki.videocontroller.component.CompleteView; 11 | import xyz.doikki.videocontroller.component.ErrorView; 12 | import xyz.doikki.videoplayer.controller.GestureVideoController; 13 | 14 | /** 15 | * 悬浮播放控制器 16 | * Created by Doikki on 2017/6/1. 17 | */ 18 | public class FloatController extends GestureVideoController { 19 | 20 | public FloatController(@NonNull Context context) { 21 | super(context); 22 | } 23 | 24 | public FloatController(@NonNull Context context, @Nullable AttributeSet attrs) { 25 | super(context, attrs); 26 | } 27 | 28 | @Override 29 | protected int getLayoutId() { 30 | return 0; 31 | } 32 | 33 | @Override 34 | protected void initView() { 35 | super.initView(); 36 | addControlComponent(new CompleteView(getContext())); 37 | addControlComponent(new ErrorView(getContext())); 38 | addControlComponent(new PipControlView(getContext())); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/controller/TikTokController.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.controller; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | 6 | import androidx.annotation.NonNull; 7 | import androidx.annotation.Nullable; 8 | 9 | import xyz.doikki.dkplayer.widget.component.DebugInfoView; 10 | import xyz.doikki.videoplayer.controller.BaseVideoController; 11 | 12 | /** 13 | * 抖音 14 | * Created by Doikki on 2018/1/6. 15 | */ 16 | 17 | public class TikTokController extends BaseVideoController { 18 | 19 | public TikTokController(@NonNull Context context) { 20 | super(context); 21 | } 22 | 23 | public TikTokController(@NonNull Context context, @Nullable AttributeSet attrs) { 24 | super(context, attrs); 25 | } 26 | 27 | public TikTokController(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 28 | super(context, attrs, defStyleAttr); 29 | } 30 | 31 | { 32 | //显示调试信息 33 | addControlComponent(new DebugInfoView(getContext())); 34 | } 35 | 36 | @Override 37 | protected int getLayoutId() { 38 | return 0; 39 | } 40 | 41 | @Override 42 | public boolean showNetWarning() { 43 | //不显示移动网络播放警告 44 | return false; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/player/CustomExoMediaPlayer.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.player; 2 | 3 | 4 | import android.content.Context; 5 | 6 | import xyz.doikki.videoplayer.exo.ExoMediaPlayer; 7 | import com.google.android.exoplayer2.source.MediaSource; 8 | 9 | /** 10 | * 自定义ExoMediaPlayer,目前扩展了诸如边播边存,以及可以直接设置Exo自己的MediaSource。 11 | */ 12 | public class CustomExoMediaPlayer extends ExoMediaPlayer { 13 | 14 | public CustomExoMediaPlayer(Context context) { 15 | super(context); 16 | } 17 | 18 | public void setDataSource(MediaSource dataSource) { 19 | mMediaSource = dataSource; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/SurfaceRenderViewFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render; 2 | 3 | import android.content.Context; 4 | 5 | import xyz.doikki.videoplayer.render.IRenderView; 6 | import xyz.doikki.videoplayer.render.RenderViewFactory; 7 | 8 | public class SurfaceRenderViewFactory extends RenderViewFactory { 9 | 10 | public static SurfaceRenderViewFactory create() { 11 | return new SurfaceRenderViewFactory(); 12 | } 13 | 14 | @Override 15 | public IRenderView createRenderView(Context context) { 16 | return new SurfaceRenderView(context); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/TikTokRenderViewFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render; 2 | 3 | import android.content.Context; 4 | 5 | import xyz.doikki.videoplayer.render.IRenderView; 6 | import xyz.doikki.videoplayer.render.RenderViewFactory; 7 | import xyz.doikki.videoplayer.render.TextureRenderView; 8 | 9 | public class TikTokRenderViewFactory extends RenderViewFactory { 10 | 11 | public static TikTokRenderViewFactory create() { 12 | return new TikTokRenderViewFactory(); 13 | } 14 | 15 | @Override 16 | public IRenderView createRenderView(Context context) { 17 | return new TikTokRenderView(new TextureRenderView(context)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl/GLSurfaceRenderViewFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl; 2 | 3 | import android.content.Context; 4 | 5 | import xyz.doikki.videoplayer.render.IRenderView; 6 | import xyz.doikki.videoplayer.render.RenderViewFactory; 7 | 8 | public class GLSurfaceRenderViewFactory extends RenderViewFactory { 9 | 10 | public static GLSurfaceRenderViewFactory create() { 11 | return new GLSurfaceRenderViewFactory(); 12 | } 13 | 14 | @Override 15 | public IRenderView createRenderView(Context context) { 16 | return new GLSurfaceRenderView(context); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/GLSurfaceTexture.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2; 2 | 3 | import android.graphics.SurfaceTexture; 4 | 5 | import xyz.doikki.dkplayer.widget.render.gl2.filter.GlPreviewFilter; 6 | 7 | 8 | class GLSurfaceTexture implements SurfaceTexture.OnFrameAvailableListener { 9 | 10 | private final SurfaceTexture surfaceTexture; 11 | private SurfaceTexture.OnFrameAvailableListener onFrameAvailableListener; 12 | 13 | GLSurfaceTexture(final int texName) { 14 | surfaceTexture = new SurfaceTexture(texName); 15 | surfaceTexture.setOnFrameAvailableListener(this); 16 | } 17 | 18 | void setOnFrameAvailableListener(final SurfaceTexture.OnFrameAvailableListener l) { 19 | onFrameAvailableListener = l; 20 | } 21 | 22 | 23 | int getTextureTarget() { 24 | return GlPreviewFilter.GL_TEXTURE_EXTERNAL_OES; 25 | } 26 | 27 | void updateTexImage() { 28 | surfaceTexture.updateTexImage(); 29 | } 30 | 31 | void getTransformMatrix(final float[] mtx) { 32 | surfaceTexture.getTransformMatrix(mtx); 33 | } 34 | 35 | SurfaceTexture getSurfaceTexture() { 36 | return surfaceTexture; 37 | } 38 | 39 | public void onFrameAvailable(final SurfaceTexture surfaceTexture) { 40 | if (onFrameAvailableListener != null) { 41 | onFrameAvailableListener.onFrameAvailable(this.surfaceTexture); 42 | } 43 | } 44 | 45 | public void release() { 46 | surfaceTexture.release(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/Resolution.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2; 2 | 3 | import java.io.Serializable; 4 | 5 | public class Resolution implements Serializable { 6 | private final int width; 7 | private final int height; 8 | 9 | public Resolution(int width, int height) { 10 | this.width = width; 11 | this.height = height; 12 | } 13 | 14 | public int width() { 15 | return width; 16 | } 17 | 18 | public int height() { 19 | return height; 20 | } 21 | 22 | @Override 23 | public boolean equals(Object o) { 24 | if (this == o) return true; 25 | if (o == null || getClass() != o.getClass()) return false; 26 | 27 | Resolution that = (Resolution) o; 28 | 29 | if (height != that.height) return false; 30 | return width == that.width; 31 | } 32 | 33 | @Override 34 | public int hashCode() { 35 | int result = width; 36 | result = 31 * result + height; 37 | return result; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/contextfactory/GLContextFactory.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.contextfactory; 2 | 3 | import static javax.microedition.khronos.egl.EGL10.EGL_NONE; 4 | import static javax.microedition.khronos.egl.EGL10.EGL_NO_CONTEXT; 5 | 6 | import android.opengl.GLSurfaceView; 7 | import android.util.Log; 8 | 9 | import javax.microedition.khronos.egl.EGL10; 10 | import javax.microedition.khronos.egl.EGLConfig; 11 | import javax.microedition.khronos.egl.EGLContext; 12 | import javax.microedition.khronos.egl.EGLDisplay; 13 | 14 | 15 | public class GLContextFactory implements GLSurfaceView.EGLContextFactory { 16 | 17 | private static final String TAG = "EContextFactory"; 18 | 19 | private final int EGL_CLIENT_VERSION = 2; 20 | 21 | private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098; 22 | 23 | @Override 24 | public EGLContext createContext(final EGL10 egl, final EGLDisplay display, final EGLConfig config) { 25 | final int[] attrib_list; 26 | attrib_list = new int[]{EGL_CONTEXT_CLIENT_VERSION, EGL_CLIENT_VERSION, EGL_NONE}; 27 | return egl.eglCreateContext(display, config, EGL_NO_CONTEXT, attrib_list); 28 | } 29 | 30 | @Override 31 | public void destroyContext(final EGL10 egl, final EGLDisplay display, final EGLContext context) { 32 | if (!egl.eglDestroyContext(display, context)) { 33 | Log.e(TAG, "display:" + display + " context: " + context); 34 | throw new RuntimeException("eglDestroyContex" + egl.eglGetError()); 35 | } 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlBrightnessFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | 4 | import android.opengl.GLES20; 5 | 6 | /** 7 | * brightness value ranges from -1.0 to 1.0, with 0.0 as the normal level 8 | */ 9 | public class GlBrightnessFilter extends GlFilter { 10 | private static final String BRIGHTNESS_FRAGMENT_SHADER = "" + 11 | "precision mediump float;" + 12 | " varying vec2 vTextureCoord;\n" + 13 | " \n" + 14 | " uniform lowp sampler2D sTexture;\n" + 15 | " uniform lowp float brightness;\n" + 16 | " \n" + 17 | " void main()\n" + 18 | " {\n" + 19 | " lowp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 20 | " \n" + 21 | " gl_FragColor = vec4((textureColor.rgb + vec3(brightness)), textureColor.w);\n" + 22 | " }"; 23 | 24 | public GlBrightnessFilter() { 25 | super(DEFAULT_VERTEX_SHADER, BRIGHTNESS_FRAGMENT_SHADER); 26 | } 27 | 28 | private float brightness = 0f; 29 | 30 | public void setBrightness(float brightness) { 31 | this.brightness = brightness; 32 | } 33 | 34 | @Override 35 | public void onDraw() { 36 | GLES20.glUniform1f(getHandle("brightness"), brightness); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlContrastFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | 4 | import android.opengl.GLES20; 5 | 6 | /** 7 | * Changes the contrast of the image. 8 | * contrast value ranges from 0.0 to 4.0, with 1.0 as the normal level 9 | */ 10 | public class GlContrastFilter extends GlFilter { 11 | 12 | private static final String CONTRAST_FRAGMENT_SHADER = "" + 13 | "precision mediump float;" + 14 | " varying vec2 vTextureCoord;\n" + 15 | " \n" + 16 | " uniform lowp sampler2D sTexture;\n" + 17 | " uniform lowp float contrast;\n" + 18 | " \n" + 19 | " void main()\n" + 20 | " {\n" + 21 | " lowp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 22 | " \n" + 23 | " gl_FragColor = vec4(((textureColor.rgb - vec3(0.5)) * contrast + vec3(0.5)), textureColor.w);\n" + 24 | " }"; 25 | 26 | 27 | public GlContrastFilter() { 28 | super(DEFAULT_VERTEX_SHADER, CONTRAST_FRAGMENT_SHADER); 29 | } 30 | 31 | private float contrast = 1.2f; 32 | 33 | public void setContrast(float contrast) { 34 | this.contrast = contrast; 35 | } 36 | 37 | @Override 38 | public void onDraw() { 39 | GLES20.glUniform1f(getHandle("contrast"), contrast); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlExposureFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | /** 6 | * exposure: The adjusted exposure (-10.0 - 10.0, with 0.0 as the default) 7 | */ 8 | public class GlExposureFilter extends GlFilter { 9 | 10 | private static final String EXPOSURE_FRAGMENT_SHADER = "" + 11 | "precision mediump float;" + 12 | " varying vec2 vTextureCoord;\n" + 13 | " \n" + 14 | " uniform lowp sampler2D sTexture;\n" + 15 | " uniform highp float exposure;\n" + 16 | " \n" + 17 | " void main()\n" + 18 | " {\n" + 19 | " highp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 20 | " \n" + 21 | " gl_FragColor = vec4(textureColor.rgb * pow(2.0, exposure), textureColor.w);\n" + 22 | " } "; 23 | 24 | public GlExposureFilter() { 25 | super(DEFAULT_VERTEX_SHADER, EXPOSURE_FRAGMENT_SHADER); 26 | } 27 | 28 | private float exposure = 1f; 29 | 30 | public void setExposure(float exposure) { 31 | this.exposure = exposure; 32 | } 33 | 34 | @Override 35 | public void onDraw() { 36 | GLES20.glUniform1f(getHandle("exposure"), exposure); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlGammaFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | public class GlGammaFilter extends GlFilter { 6 | private static final String GAMMA_FRAGMENT_SHADER = "" + 7 | "precision mediump float;" + 8 | " varying vec2 vTextureCoord;\n" + 9 | " \n" + 10 | " uniform lowp sampler2D sTexture;\n" + 11 | " uniform lowp float gamma;\n" + 12 | " \n" + 13 | " void main()\n" + 14 | " {\n" + 15 | " lowp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 16 | " \n" + 17 | " gl_FragColor = vec4(pow(textureColor.rgb, vec3(gamma)), textureColor.w);\n" + 18 | " }"; 19 | 20 | public GlGammaFilter() { 21 | super(DEFAULT_VERTEX_SHADER, GAMMA_FRAGMENT_SHADER); 22 | } 23 | 24 | private float gamma = 1.2f; 25 | 26 | public void setGamma(float gamma) { 27 | this.gamma = gamma; 28 | } 29 | 30 | @Override 31 | public void onDraw() { 32 | GLES20.glUniform1f(getHandle("gamma"), gamma); 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlGrayScaleFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | 4 | public class GlGrayScaleFilter extends GlFilter { 5 | 6 | private static final String FRAGMENT_SHADER = 7 | "precision mediump float;" + 8 | "varying vec2 vTextureCoord;" + 9 | "uniform lowp sampler2D sTexture;" + 10 | "const highp vec3 weight = vec3(0.2125, 0.7154, 0.0721);" + 11 | "void main() {" + 12 | "float luminance = dot(texture2D(sTexture, vTextureCoord).rgb, weight);" + 13 | "gl_FragColor = vec4(vec3(luminance), 1.0);" + 14 | "}"; 15 | 16 | public GlGrayScaleFilter() { 17 | super(DEFAULT_VERTEX_SHADER, FRAGMENT_SHADER); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlInvertFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | 4 | 5 | public class GlInvertFilter extends GlFilter { 6 | private static final String FRAGMENT_SHADER = 7 | "precision mediump float;" + 8 | "varying vec2 vTextureCoord;" + 9 | "uniform lowp sampler2D sTexture;" + 10 | "void main() {" + 11 | "lowp vec4 color = texture2D(sTexture, vTextureCoord);" + 12 | "gl_FragColor = vec4((1.0 - color.rgb), color.w);" + 13 | "}"; 14 | 15 | public GlInvertFilter() { 16 | super(DEFAULT_VERTEX_SHADER, FRAGMENT_SHADER); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlLuminanceFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | public class GlLuminanceFilter extends GlFilter { 4 | 5 | private static final String LUMINANCE_FRAGMENT_SHADER = "" + 6 | "precision mediump float;" + 7 | "\n" + 8 | " varying vec2 vTextureCoord;\n" + 9 | "\n" + 10 | " uniform lowp sampler2D sTexture;\n" + 11 | "\n" + 12 | "// Values from \"Graphics Shaders: Theory and Practice\" by Bailey and Cunningham\n" + 13 | "const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);\n" + 14 | "\n" + 15 | "void main()\n" + 16 | "{\n" + 17 | " lowp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 18 | " float luminance = dot(textureColor.rgb, W);\n" + 19 | " \n" + 20 | " gl_FragColor = vec4(vec3(luminance), textureColor.a);\n" + 21 | "}"; 22 | 23 | public GlLuminanceFilter() { 24 | super(DEFAULT_VERTEX_SHADER, LUMINANCE_FRAGMENT_SHADER); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlLuminanceThresholdFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | public class GlLuminanceThresholdFilter extends GlFilter { 6 | 7 | private static final String LUMINANCE_THRESHOLD_FRAGMENT_SHADER = "" + 8 | "precision mediump float;" + 9 | "varying highp vec2 vTextureCoord;\n" + 10 | "\n" + 11 | "uniform lowp sampler2D sTexture;\n" + 12 | "uniform highp float threshold;\n" + 13 | "\n" + 14 | "const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);\n" + 15 | "\n" + 16 | "void main()\n" + 17 | "{\n" + 18 | " highp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 19 | " highp float luminance = dot(textureColor.rgb, W);\n" + 20 | " highp float thresholdResult = step(threshold, luminance);\n" + 21 | " \n" + 22 | " gl_FragColor = vec4(vec3(thresholdResult), textureColor.w);\n" + 23 | "}"; 24 | 25 | public GlLuminanceThresholdFilter() { 26 | super(DEFAULT_VERTEX_SHADER, LUMINANCE_THRESHOLD_FRAGMENT_SHADER); 27 | } 28 | 29 | private float threshold = 0.5f; 30 | 31 | public void setThreshold(float threshold) { 32 | this.threshold = threshold; 33 | } 34 | 35 | @Override 36 | public void onDraw() { 37 | GLES20.glUniform1f(getHandle("threshold"), threshold); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlOpacityFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | /** 6 | * Adjusts the alpha channel of the incoming image 7 | * opacity: The value to multiply the incoming alpha channel for each pixel by (0.0 - 1.0, with 1.0 as the default) 8 | */ 9 | public class GlOpacityFilter extends GlFilter { 10 | 11 | private static final String OPACITY_FRAGMENT_SHADER = "" + 12 | "precision mediump float;" + 13 | " varying highp vec2 vTextureCoord;\n" + 14 | " \n" + 15 | " uniform lowp sampler2D sTexture;\n" + 16 | " uniform lowp float opacity;\n" + 17 | " \n" + 18 | " void main()\n" + 19 | " {\n" + 20 | " lowp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 21 | " \n" + 22 | " gl_FragColor = vec4(textureColor.rgb, textureColor.a * opacity);\n" + 23 | " }\n"; 24 | 25 | public GlOpacityFilter() { 26 | super(DEFAULT_VERTEX_SHADER, OPACITY_FRAGMENT_SHADER); 27 | } 28 | 29 | private float opacity = 1f; 30 | 31 | public void setOpacity(float opacity) { 32 | this.opacity = opacity; 33 | } 34 | 35 | @Override 36 | public void onDraw() { 37 | GLES20.glUniform1f(getHandle("opacity"), opacity); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlPosterizeFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | public class GlPosterizeFilter extends GlFilter { 6 | 7 | private static final String POSTERIZE_FRAGMENT_SHADER = "" + 8 | "precision mediump float;" + 9 | " varying vec2 vTextureCoord;\n" + 10 | "\n" + 11 | "uniform lowp sampler2D sTexture;\n" + 12 | "uniform highp float colorLevels;\n" + 13 | "\n" + 14 | "void main()\n" + 15 | "{\n" + 16 | " highp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 17 | " \n" + 18 | " gl_FragColor = floor((textureColor * colorLevels) + vec4(0.5)) / colorLevels;\n" + 19 | "}"; 20 | 21 | public GlPosterizeFilter() { 22 | super(DEFAULT_VERTEX_SHADER, POSTERIZE_FRAGMENT_SHADER); 23 | } 24 | 25 | private int colorLevels = 10; 26 | 27 | public void setColorLevels(int colorLevels) { 28 | if (colorLevels < 0) { 29 | this.colorLevels = 0; 30 | } else if (colorLevels > 256) { 31 | this.colorLevels = 256; 32 | } else { 33 | this.colorLevels = colorLevels; 34 | } 35 | } 36 | 37 | @Override 38 | public void onDraw() { 39 | GLES20.glUniform1f(getHandle("colorLevels"), colorLevels); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlSaturationFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | public class GlSaturationFilter extends GlFilter { 6 | private static final String SATURATION_FRAGMENT_SHADER = "" + 7 | "precision mediump float;" + 8 | " varying vec2 vTextureCoord;\n" + 9 | " \n" + 10 | " uniform lowp sampler2D sTexture;\n" + 11 | " uniform lowp float saturation;\n" + 12 | " \n" + 13 | " const mediump vec3 luminanceWeighting = vec3(0.2125, 0.7154, 0.0721);\n" + 14 | " \n" + 15 | " void main()\n" + 16 | " {\n" + 17 | " lowp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 18 | " lowp float luminance = dot(textureColor.rgb, luminanceWeighting);\n" + 19 | " lowp vec3 greyScaleColor = vec3(luminance);\n" + 20 | " \n" + 21 | " gl_FragColor = vec4(mix(greyScaleColor, textureColor.rgb, saturation), textureColor.w);\n" + 22 | " \n" + 23 | " }"; 24 | 25 | 26 | public GlSaturationFilter() { 27 | super(DEFAULT_VERTEX_SHADER, SATURATION_FRAGMENT_SHADER); 28 | } 29 | 30 | private float saturation = 1f; 31 | 32 | public void setSaturation(float saturation) { 33 | this.saturation = saturation; 34 | } 35 | 36 | @Override 37 | public void onDraw() { 38 | GLES20.glUniform1f(getHandle("saturation"), saturation); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlSepiaFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | 4 | public class GlSepiaFilter extends GlFilter { 5 | private static final String FRAGMENT_SHADER = 6 | "precision mediump float;" + 7 | "varying vec2 vTextureCoord;" + 8 | "uniform lowp sampler2D sTexture;" + 9 | "const highp vec3 weight = vec3(0.2125, 0.7154, 0.0721);" + 10 | "void main() {" + 11 | " vec4 FragColor = texture2D(sTexture, vTextureCoord);\n" + 12 | " gl_FragColor.r = dot(FragColor.rgb, vec3(.393, .769, .189));\n" + 13 | " gl_FragColor.g = dot(FragColor.rgb, vec3(.349, .686, .168));\n" + 14 | " gl_FragColor.b = dot(FragColor.rgb, vec3(.272, .534, .131));\n" + 15 | "}"; 16 | 17 | public GlSepiaFilter() { 18 | super(DEFAULT_VERTEX_SHADER, FRAGMENT_SHADER); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlSolarizeFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | public class GlSolarizeFilter extends GlFilter { 6 | 7 | private static final String SOLATIZE_FRAGMENT_SHADER = "" + 8 | "precision mediump float;" + 9 | " varying vec2 vTextureCoord;\n" + 10 | "\n" + 11 | " uniform lowp sampler2D sTexture;\n" + 12 | " uniform highp float threshold;\n" + 13 | "\n" + 14 | " const highp vec3 W = vec3(0.2125, 0.7154, 0.0721);\n" + 15 | "\n" + 16 | "void main()\n" + 17 | "{\n" + 18 | " highp vec4 textureColor = texture2D(sTexture, vTextureCoord);\n" + 19 | " highp float luminance = dot(textureColor.rgb, W);\n" + 20 | " highp float thresholdResult = step(luminance, threshold);\n" + 21 | " highp vec3 finalColor = abs(thresholdResult - textureColor.rgb);\n" + 22 | " \n" + 23 | " gl_FragColor = vec4(finalColor, textureColor.w);\n" + 24 | "}"; 25 | 26 | public GlSolarizeFilter() { 27 | super(DEFAULT_VERTEX_SHADER, SOLATIZE_FRAGMENT_SHADER); 28 | } 29 | 30 | private float threshold = 0.5f; 31 | 32 | public void setThreshold(float threshold) { 33 | this.threshold = threshold; 34 | } 35 | 36 | @Override 37 | public void onDraw() { 38 | GLES20.glUniform1f(getHandle("threshold"), threshold); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlVibranceFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.opengl.GLES20; 4 | 5 | public class GlVibranceFilter extends GlFilter { 6 | 7 | private static final String VIBRANCE_FRAGMENT_SHADER = "" + 8 | "precision mediump float;" + 9 | " varying vec2 vTextureCoord;\n" + 10 | "\n" + 11 | " uniform lowp sampler2D sTexture;\n" + 12 | " uniform lowp float vibrance;\n" + 13 | "\n" + 14 | "void main() {\n" + 15 | " lowp vec4 color = texture2D(sTexture, vTextureCoord);\n" + 16 | " lowp float average = (color.r + color.g + color.b) / 3.0;\n" + 17 | " lowp float mx = max(color.r, max(color.g, color.b));\n" + 18 | " lowp float amt = (mx - average) * (-vibrance * 3.0);\n" + 19 | " color.rgb = mix(color.rgb, vec3(mx), amt);\n" + 20 | " gl_FragColor = color;\n" + 21 | "}"; 22 | 23 | public GlVibranceFilter() { 24 | super(DEFAULT_VERTEX_SHADER, VIBRANCE_FRAGMENT_SHADER); 25 | } 26 | 27 | private float vibrance = 0f; 28 | 29 | public void setVibrance(float vibrance) { 30 | this.vibrance = vibrance; 31 | } 32 | 33 | @Override 34 | public void onDraw() { 35 | GLES20.glUniform1f(getHandle("vibrance"), vibrance); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/java/xyz/doikki/dkplayer/widget/render/gl2/filter/GlWatermarkFilter.java: -------------------------------------------------------------------------------- 1 | package xyz.doikki.dkplayer.widget.render.gl2.filter; 2 | 3 | import android.graphics.Bitmap; 4 | import android.graphics.Canvas; 5 | 6 | public class GlWatermarkFilter extends GlOverlayFilter { 7 | 8 | private final Bitmap bitmap; 9 | private Position position = Position.LEFT_TOP; 10 | 11 | public GlWatermarkFilter(Bitmap bitmap) { 12 | this.bitmap = bitmap; 13 | } 14 | 15 | 16 | public GlWatermarkFilter(Bitmap bitmap, Position position) { 17 | this.bitmap = bitmap; 18 | this.position = position; 19 | } 20 | 21 | @Override 22 | protected void drawCanvas(Canvas canvas) { 23 | if (bitmap != null && !bitmap.isRecycled()) { 24 | switch (position) { 25 | case LEFT_TOP: 26 | canvas.drawBitmap(bitmap, 0, 0, null); 27 | break; 28 | case LEFT_BOTTOM: 29 | canvas.drawBitmap(bitmap, 0, canvas.getHeight() - bitmap.getHeight(), null); 30 | break; 31 | case RIGHT_TOP: 32 | canvas.drawBitmap(bitmap, canvas.getWidth() - bitmap.getWidth(), 0, null); 33 | break; 34 | case RIGHT_BOTTOM: 35 | canvas.drawBitmap(bitmap, canvas.getWidth() - bitmap.getWidth(), canvas.getHeight() - bitmap.getHeight(), null); 36 | break; 37 | } 38 | } 39 | } 40 | 41 | public enum Position { 42 | LEFT_TOP, 43 | LEFT_BOTTOM, 44 | RIGHT_TOP, 45 | RIGHT_BOTTOM 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_alpha_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_alpha_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_float_window_enter.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 11 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_float_window_exit.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 9 | 11 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_slide_bottom_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_slide_bottom_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_slide_top_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/anim/anim_slide_top_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_extension.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_functions.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_list.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_picture_in_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-hdpi/ic_tab_picture_in_picture.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_extension.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_functions.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_list.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_picture_in_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-mdpi/ic_tab_picture_in_picture.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_extension.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_functions.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_list.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_picture_in_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xhdpi/ic_tab_picture_in_picture.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_extension.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_functions.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_list.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_picture_in_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxhdpi/ic_tab_picture_in_picture.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_extension.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_extension.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_functions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_functions.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_list.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_picture_in_picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Doikki/DKVideoPlayer/79a8c92678126ff36036b3a14b09d6c98821812c/dkplayer-sample/src/main/res/drawable-xxxhdpi/ic_tab_picture_in_picture.png -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable/selector_mute_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable/shape_ad_bg.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/drawable/shape_float_window_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /dkplayer-sample/src/main/res/layout/activity_custom_ijk_player.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 15 | 16 |