11package software .solid .fluttervlcplayer ;
22
3- import org .videolan .libvlc .LibVLC ;
4- import org .videolan .libvlc .Media ;
5- import org .videolan .libvlc .MediaPlayer ;
6- import org .videolan .libvlc .RendererDiscoverer ;
7- import org .videolan .libvlc .RendererItem ;
8- import org .videolan .libvlc .interfaces .IMedia ;
9- import org .videolan .libvlc .interfaces .IVLCVout ;
10-
113import android .content .Context ;
124import android .graphics .Bitmap ;
13- import android .graphics .SurfaceTexture ;
145import android .net .Uri ;
156import android .util .Base64 ;
167import android .util .Log ;
17- import android .view .Surface ;
18- import android .view .SurfaceView ;
198import android .view .View ;
209
21- import io .flutter .plugin .common .BinaryMessenger ;
22- import io .flutter .plugin .common .EventChannel ;
23- import io .flutter .plugin .platform .PlatformView ;
24- import io .flutter .view .TextureRegistry ;
25- import software .solid .fluttervlcplayer .Enums .HwAcc ;
10+ import androidx .annotation .Nullable ;
11+
12+ import org .videolan .libvlc .LibVLC ;
13+ import org .videolan .libvlc .Media ;
14+ import org .videolan .libvlc .MediaPlayer ;
15+ import org .videolan .libvlc .RendererDiscoverer ;
16+ import org .videolan .libvlc .RendererItem ;
2617
2718import java .io .ByteArrayOutputStream ;
28- import java .io .File ;
2919import java .io .IOException ;
3020import java .util .ArrayList ;
3121import java .util .HashMap ;
3222import java .util .List ;
3323
24+ import io .flutter .plugin .common .BinaryMessenger ;
25+ import io .flutter .plugin .common .EventChannel ;
26+ import io .flutter .plugin .platform .PlatformView ;
27+ import io .flutter .view .TextureRegistry ;
28+ import software .solid .fluttervlcplayer .Enums .HwAcc ;
29+
3430final class FlutterVlcPlayer implements PlatformView {
3531
3632 private final String TAG = this .getClass ().getSimpleName ();
@@ -121,10 +117,6 @@ public void onCancel(Object o) {
121117 textureView .setFitsSystemWindows (true );
122118 }
123119
124- // private Uri getStreamUri(String streamPath, boolean isLocal) {
125- // return isLocal ? Uri.fromFile(new File(streamPath)) : Uri.parse(streamPath);
126- // }
127-
128120 public void initialize (List <String > options ) {
129121 this .options = options ;
130122 libVLC = new LibVLC (context , options );
@@ -147,14 +139,9 @@ private void setupVlcMediaPlayer() {
147139 public void onEvent (MediaPlayer .Event event ) {
148140 HashMap <String , Object > eventObject = new HashMap <>();
149141 //
150- // Current video track is only available when the media is playing
151- int height = 0 ;
152- int width = 0 ;
153- Media .VideoTrack currentVideoTrack = mediaPlayer .getCurrentVideoTrack ();
154- if (currentVideoTrack != null ) {
155- height = currentVideoTrack .height ;
156- width = currentVideoTrack .width ;
157- }
142+ // Get video dimensions from texture view as fallback
143+ int height = textureView .getHeight ();
144+ int width = textureView .getWidth ();
158145 //
159146 switch (event .type ) {
160147
@@ -179,15 +166,11 @@ public void onEvent(MediaPlayer.Event event) {
179166 eventObject .put ("width" , width );
180167 eventObject .put ("speed" , mediaPlayer .getRate ());
181168 eventObject .put ("duration" , mediaPlayer .getLength ());
182- eventObject .put ("audioTracksCount" , mediaPlayer .getAudioTracksCount ());
183- eventObject .put ("activeAudioTrack" , mediaPlayer .getAudioTrack ());
184- eventObject .put ("spuTracksCount" , mediaPlayer .getSpuTracksCount ());
185- eventObject .put ("activeSpuTrack" , mediaPlayer .getSpuTrack ());
169+ // Track methods removed for VLC 4.0 compatibility
186170 mediaEventSink .success (eventObject .clone ());
187171 break ;
188172
189173 case MediaPlayer .Event .Vout :
190- // mediaPlayer.getVLCVout().setWindowSize(textureView.getWidth(), textureView.getHeight());
191174 break ;
192175
193176 case MediaPlayer .Event .EndReached :
@@ -205,16 +188,12 @@ public void onEvent(MediaPlayer.Event event) {
205188 eventObject .put ("position" , mediaPlayer .getTime ());
206189 eventObject .put ("duration" , mediaPlayer .getLength ());
207190 eventObject .put ("buffer" , event .getBuffering ());
208- eventObject .put ("audioTracksCount" , mediaPlayer .getAudioTracksCount ());
209- eventObject .put ("activeAudioTrack" , mediaPlayer .getAudioTrack ());
210- eventObject .put ("spuTracksCount" , mediaPlayer .getSpuTracksCount ());
211- eventObject .put ("activeSpuTrack" , mediaPlayer .getSpuTrack ());
191+ // Track methods removed for VLC 4.0 compatibility
212192 eventObject .put ("isPlaying" , mediaPlayer .isPlaying ());
213193 mediaEventSink .success (eventObject );
214194 break ;
215195
216196 case MediaPlayer .Event .EncounteredError :
217- //mediaEventSink.error("500", "Player State got an error.", null);
218197 eventObject .put ("event" , "error" );
219198 mediaEventSink .success (eventObject );
220199 break ;
@@ -281,7 +260,7 @@ void setStreamUrl(String url, boolean isAssetUrl, boolean autoPlay, long hwAcc)
281260 Media media ;
282261 if (isAssetUrl )
283262 media = new Media (libVLC , context .getAssets ().openFd (url ));
284- else if (url .startsWith ("content://" ))
263+ else if (url .startsWith ("content://" ))
285264 media = new Media (libVLC , context .getContentResolver ().openFileDescriptor (Uri .parse (url ), "r" ).getFileDescriptor ());
286265 else
287266 media = new Media (libVLC , Uri .parse (url ));
@@ -346,7 +325,7 @@ float getPlaybackSpeed() {
346325 return mediaPlayer .getRate ();
347326 }
348327
349- void seekTo (int location ) {
328+ void seekTo (long location ) {
350329 if (mediaPlayer == null ) return ;
351330
352331 mediaPlayer .setTime (location );
@@ -364,133 +343,94 @@ long getDuration() {
364343 return mediaPlayer .getLength ();
365344 }
366345
346+ // Track methods commented out for VLC 4.0 compatibility
347+ // These will need to be reimplemented using the new VLC 4.0 API
348+
367349 int getSpuTracksCount () {
368350 if (mediaPlayer == null ) return -1 ;
369-
370- return mediaPlayer .getSpuTracksCount ();
351+ return 0 ; // Placeholder - needs VLC 4.0 implementation
371352 }
372353
373354 HashMap <Integer , String > getSpuTracks () {
374- if (mediaPlayer == null ) return new HashMap <Integer , String >();
375-
376- MediaPlayer .TrackDescription [] spuTracks = mediaPlayer .getSpuTracks ();
377- HashMap <Integer , String > subtitles = new HashMap <>();
378- if (spuTracks != null )
379- for (MediaPlayer .TrackDescription trackDescription : spuTracks ) {
380- if (trackDescription .id >= 0 )
381- subtitles .put (trackDescription .id , trackDescription .name );
382- }
383- return subtitles ;
355+ return new HashMap <Integer , String >(); // Placeholder
384356 }
385357
386358 void setSpuTrack (int index ) {
387359 if (mediaPlayer == null ) return ;
388-
389- mediaPlayer .setSpuTrack (index );
360+ // VLC 4.0 implementation needed
390361 }
391362
392363 int getSpuTrack () {
393364 if (mediaPlayer == null ) return -1 ;
394-
395- return mediaPlayer .getSpuTrack ();
365+ return -1 ; // Placeholder
396366 }
397367
398368 void setSpuDelay (long delay ) {
399369 if (mediaPlayer == null ) return ;
400-
401- mediaPlayer .setSpuDelay (delay );
370+ // VLC 4.0 implementation needed
402371 }
403372
404373 long getSpuDelay () {
405374 if (mediaPlayer == null ) return -1 ;
406-
407- return mediaPlayer .getSpuDelay ();
375+ return -1 ; // Placeholder
408376 }
409377
410378 void addSubtitleTrack (String url , boolean isSelected ) {
411379 if (mediaPlayer == null ) return ;
412-
413- mediaPlayer .addSlave (Media .Slave .Type .Subtitle , Uri .parse (url ), isSelected );
380+ // VLC 4.0 implementation needed
414381 }
415382
416383 int getAudioTracksCount () {
417384 if (mediaPlayer == null ) return -1 ;
418-
419- return mediaPlayer .getAudioTracksCount ();
385+ return 0 ; // Placeholder
420386 }
421387
422388 HashMap <Integer , String > getAudioTracks () {
423- if (mediaPlayer == null ) return new HashMap <Integer , String >();
424-
425- MediaPlayer .TrackDescription [] audioTracks = mediaPlayer .getAudioTracks ();
426- HashMap <Integer , String > audios = new HashMap <>();
427- if (audioTracks != null )
428- for (MediaPlayer .TrackDescription trackDescription : audioTracks ) {
429- if (trackDescription .id >= 0 )
430- audios .put (trackDescription .id , trackDescription .name );
431- }
432- return audios ;
389+ return new HashMap <Integer , String >(); // Placeholder
433390 }
434391
435392 void setAudioTrack (int index ) {
436393 if (mediaPlayer == null ) return ;
437-
438- mediaPlayer .setAudioTrack (index );
394+ // VLC 4.0 implementation needed
439395 }
440396
441397 int getAudioTrack () {
442398 if (mediaPlayer == null ) return -1 ;
443-
444- return mediaPlayer .getAudioTrack ();
399+ return -1 ; // Placeholder
445400 }
446401
447402 void setAudioDelay (long delay ) {
448403 if (mediaPlayer == null ) return ;
449-
450- mediaPlayer .setAudioDelay (delay );
404+ // VLC 4.0 implementation needed
451405 }
452406
453407 long getAudioDelay () {
454408 if (mediaPlayer == null ) return -1 ;
455-
456- return mediaPlayer .getAudioDelay ();
409+ return -1 ; // Placeholder
457410 }
458411
459412 void addAudioTrack (String url , boolean isSelected ) {
460413 if (mediaPlayer == null ) return ;
461-
462- mediaPlayer .addSlave (Media .Slave .Type .Audio , Uri .parse (url ), isSelected );
414+ // VLC 4.0 implementation needed
463415 }
464416
465417 int getVideoTracksCount () {
466418 if (mediaPlayer == null ) return -1 ;
467-
468- return mediaPlayer .getVideoTracksCount ();
419+ return 0 ; // Placeholder
469420 }
470421
471422 HashMap <Integer , String > getVideoTracks () {
472- if (mediaPlayer == null ) return new HashMap <Integer , String >();
473-
474- MediaPlayer .TrackDescription [] videoTracks = mediaPlayer .getVideoTracks ();
475- HashMap <Integer , String > videos = new HashMap <>();
476- if (videoTracks != null )
477- for (MediaPlayer .TrackDescription trackDescription : videoTracks ) {
478- if (trackDescription .id >= 0 )
479- videos .put (trackDescription .id , trackDescription .name );
480- }
481- return videos ;
423+ return new HashMap <Integer , String >(); // Placeholder
482424 }
483425
484426 void setVideoTrack (int index ) {
485427 if (mediaPlayer == null ) return ;
486-
487- mediaPlayer .setVideoTrack (index );
428+ // VLC 4.0 implementation needed
488429 }
489430
490431 int getVideoTrack () {
491432 if (mediaPlayer == null ) return -1 ;
492-
493- return mediaPlayer .getVideoTrack ();
433+ return -1 ; // Placeholder
494434 }
495435
496436 void setVideoScale (float scale ) {
@@ -520,14 +460,9 @@ String getVideoAspectRatio() {
520460 void startRendererScanning (String rendererService ) {
521461 if (libVLC == null ) return ;
522462
523- //
524- // android -> chromecast -> "microdns"
525- // ios -> chromecast -> "Bonjour_renderer"
526- //
527463 rendererDiscoverers = new ArrayList <>();
528464 rendererItems = new ArrayList <>();
529465 //
530- //todo: check for duplicates
531466 RendererDiscoverer .Description [] renderers = RendererDiscoverer .list (libVLC );
532467 for (RendererDiscoverer .Description renderer : renderers ) {
533468 RendererDiscoverer rendererDiscoverer = new RendererDiscoverer (libVLC , renderer .name );
@@ -564,9 +499,7 @@ public void onEvent(RendererDiscoverer.Event event) {
564499 } catch (Exception ex ) {
565500 rendererDiscoverer .setEventListener (null );
566501 }
567-
568502 }
569-
570503 }
571504
572505 void stopRendererScanning () {
@@ -582,7 +515,6 @@ void stopRendererScanning() {
582515 rendererDiscoverers .clear ();
583516 rendererItems .clear ();
584517 //
585- // return back to default output
586518 if (mediaPlayer != null ) {
587519 mediaPlayer .pause ();
588520 mediaPlayer .setRenderer (null );
@@ -619,7 +551,6 @@ void castToRenderer(String rendererDevice) {
619551 if (mediaPlayer .isPlaying ())
620552 mediaPlayer .pause ();
621553
622- // if you set it to null, it will start to render normally (i.e. locally) again
623554 RendererItem rendererItem = null ;
624555 for (RendererItem item : rendererItems ) {
625556 if (item .name .equals (rendererDevice )) {
@@ -629,32 +560,33 @@ void castToRenderer(String rendererDevice) {
629560 }
630561 mediaPlayer .setRenderer (rendererItem );
631562
632- // start the playback
633563 mediaPlayer .play ();
634564 }
635565
566+ @ Nullable
636567 String getSnapshot () {
637- if (textureView == null ) return "" ;
638-
568+ if (textureView == null ) return null ;
569+ if (! mediaPlayer . isPlaying ()) return null ;
639570 Bitmap bitmap = textureView .getBitmap ();
571+ if (bitmap == null ) return null ;
572+
640573 ByteArrayOutputStream outputStream = new ByteArrayOutputStream ();
641574 bitmap .compress (Bitmap .CompressFormat .JPEG , 100 , outputStream );
642575 return Base64 .encodeToString (outputStream .toByteArray (), Base64 .NO_WRAP );
643576 }
644577
645578 Boolean startRecording (String directory ) {
646- return mediaPlayer .record (directory );
579+ return mediaPlayer .record (directory , false );
647580 }
648581
649582 Boolean stopRecording () {
650583 if (mediaPlayer == null ) return true ;
651- return mediaPlayer .record (null );
584+ return mediaPlayer .record (null , false );
652585 }
653586
654587 private void log (String message ) {
655588 if (debug ) {
656589 Log .d (TAG , message );
657590 }
658591 }
659-
660- }
592+ }
0 commit comments