Skip to content

Commit c4b5e6d

Browse files
author
Nay Linn
committed
fix(android): update library to support 16kb
1 parent b5d827f commit c4b5e6d

File tree

6 files changed

+63
-143
lines changed

6 files changed

+63
-143
lines changed

flutter_vlc_player/android/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ group 'software.solid.fluttervlcplayer'
22
version '1.0-SNAPSHOT'
33

44
buildscript {
5-
ext.kotlin_version = "1.8.22"
5+
ext.kotlin_version = "2.1.0"
66
repositories {
77
google()
88
mavenCentral()
@@ -50,7 +50,7 @@ android {
5050
dependencies {
5151
testImplementation("org.jetbrains.kotlin:kotlin-test")
5252
testImplementation("org.mockito:mockito-core:5.0.0")
53-
implementation 'org.videolan.android:libvlc-all:3.6.0-eap14'
53+
implementation 'org.videolan.android:libvlc-all:4.0.0-eap21'
5454
implementation 'androidx.appcompat:appcompat:1.7.0'
5555
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
5656
implementation 'androidx.annotation:annotation:1.9.1'

flutter_vlc_player/android/src/main/java/software/solid/fluttervlcplayer/FlutterVlcPlayer.java

Lines changed: 49 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,32 @@
11
package 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-
113
import android.content.Context;
124
import android.graphics.Bitmap;
13-
import android.graphics.SurfaceTexture;
145
import android.net.Uri;
156
import android.util.Base64;
167
import android.util.Log;
17-
import android.view.Surface;
18-
import android.view.SurfaceView;
198
import 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

2718
import java.io.ByteArrayOutputStream;
28-
import java.io.File;
2919
import java.io.IOException;
3020
import java.util.ArrayList;
3121
import java.util.HashMap;
3222
import 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+
3430
final 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+
}

flutter_vlc_player/example/android/settings.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ pluginManagement {
1919
plugins {
2020
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
2121
id("com.android.application") version "8.7.0" apply false
22-
id("org.jetbrains.kotlin.android") version "1.8.22" apply false
22+
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
2323
}
2424

2525
include(":app")

0 commit comments

Comments
 (0)