Skip to content

Commit

Permalink
Merge pull request alexmercerind#163 from alexmercerind/buffering-pro…
Browse files Browse the repository at this point in the history
…gress

Buffering progress
  • Loading branch information
alexmercerind authored Sep 26, 2021
2 parents 89e557c + bf526ba commit 7c09a6f
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 22 deletions.
14 changes: 4 additions & 10 deletions dartvlc/api/api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,8 @@ void PlayerCreate(int32_t id, int32_t video_width, int32_t video_height,
player->OnPosition([=](int32_t) -> void { OnPosition(id, player->state()); });
player->OnOpen([=](VLC::Media) -> void { OnOpen(id, player->state()); });
player->OnPlaylist([=]() -> void { OnOpen(id, player->state()); });
#if defined(_WIN32) || defined(__APPLE__)
/* Windows/macOS: Texture & flutter::TextureRegistrar */
#else
/* Linux: decodeImageFromPixels & NativePorts */
player->OnVideo([=](uint8_t* frame, int32_t width, int32_t height) -> void {
OnVideo(id, player->video_width() * player->video_height() * 4, frame);
});
#endif
player->OnBuffering(
[=](float buffering) -> void { OnBuffering(id, buffering); });
player->OnVideoDimensions(
[=](int32_t video_width, int32_t video_height) -> void {
OnVideoDimensions(id, video_width, video_height);
Expand Down Expand Up @@ -244,7 +238,7 @@ const char** MediaParse(Dart_Handle object, const char* type,
Dart_NewFinalizableHandle_DL(
object, reinterpret_cast<void*>(values), sizeof(values),
static_cast<Dart_HandleFinalizer>(MediaClearVector));
for (const auto & [ key, value ] : *metas) {
for (const auto& [key, value] : *metas) {
values->emplace_back(value.c_str());
}
return values->data();
Expand Down Expand Up @@ -316,7 +310,7 @@ DartDeviceList* DevicesAll(Dart_Handle object) {
static DartEqualizer* EqualizerToDart(const Equalizer* equalizer, int32_t id,
Dart_Handle dart_handle) {
auto wrapper = new DartObjects::Equalizer();
for (const auto & [ band, amp ] : equalizer->band_amps()) {
for (const auto& [band, amp] : equalizer->band_amps()) {
wrapper->bands.emplace_back(band);
wrapper->amps.emplace_back(amp);
}
Expand Down
30 changes: 26 additions & 4 deletions dartvlc/api/eventmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
#ifndef API_EVENTMANAGER_H_
#define API_EVENTMANAGER_H_

#include "base.h"
#include "player.h"
#include "api/dartmanager.h"
#include "base.h"
#include "dart_api_dl.h"
#include "player.h"
#ifdef __cplusplus
extern "C" {
#endif
Expand Down Expand Up @@ -179,7 +179,7 @@ inline void OnOpen(int32_t id, PlayerState* state) {
auto types_objects =
std::unique_ptr<Dart_CObject[]>(new Dart_CObject[media_items.size()]);
auto types_object_refs =
std::unique_ptr<Dart_CObject* []>(new Dart_CObject*[media_items.size()]);
std::unique_ptr<Dart_CObject*[]>(new Dart_CObject*[media_items.size()]);
std::vector<std::string> types_str(media_items.size());
std::vector<const char*> types_ptr(media_items.size());
for (int32_t i = 0; i < media_items.size(); i++) {
Expand All @@ -198,7 +198,7 @@ inline void OnOpen(int32_t id, PlayerState* state) {
auto resources_objects =
std::unique_ptr<Dart_CObject[]>(new Dart_CObject[media_items.size()]);
auto resources_object_refs =
std::unique_ptr<Dart_CObject* []>(new Dart_CObject*[media_items.size()]);
std::unique_ptr<Dart_CObject*[]>(new Dart_CObject*[media_items.size()]);
std::vector<std::string> resources_str(media_items.size());
std::vector<const char*> resources_ptr(media_items.size());
for (int32_t i = 0; i < media_items.size(); i++) {
Expand Down Expand Up @@ -277,6 +277,28 @@ inline void OnVideo(int32_t id, int size, uint8_t* frame) {
g_dart_post_C_object(g_callback_port, &return_object);
}

inline void OnBuffering(int32_t id, float buffering) {
Dart_CObject id_object;
id_object.type = Dart_CObject_kInt32;
id_object.value.as_int32 = id;

Dart_CObject type_object;
type_object.type = Dart_CObject_kString;
type_object.value.as_string = "bufferingEvent";

Dart_CObject buffering_object;
buffering_object.type = Dart_CObject_kDouble;
buffering_object.value.as_double = static_cast<double>(buffering);

Dart_CObject* value_objects[] = {&id_object, &type_object, &buffering_object};

Dart_CObject return_object;
return_object.type = Dart_CObject_kArray;
return_object.value.as_array.length = 3;
return_object.value.as_array.values = value_objects;
g_dart_post_C_object(g_callback_port, &return_object);
}

#ifdef __cplusplus
}
#endif
Expand Down
4 changes: 4 additions & 0 deletions dartvlc/internal/events.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,10 @@ class PlayerEvents : public PlayerGetters {
playlist_callback_ = callback;
}

void OnBuffering(std::function<void(float)> callback) {
vlc_media_player_.eventManager().onBuffering(callback);
}

void OnVideo(VideoFrameCallback callback) { video_callback_ = callback; }

protected:
Expand Down
4 changes: 2 additions & 2 deletions dartvlc/mediasource/playlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@
#ifndef MEDIASOURCE_PLAYLIST_H_
#define MEDIASOURCE_PLAYLIST_H_

#include <string>
#include <map>
#include <string>
#include <vector>

#include "mediasource/mediasource.h"
#include "mediasource/media.h"
#include "mediasource/mediasource.h"

enum PlaylistMode { single, loop, repeat };

Expand Down
9 changes: 9 additions & 0 deletions ffi/lib/src/internal/ffi.dart
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,15 @@ final ReceivePort receiver = new ReceivePort()
videoFrameCallback(id, event[2]);
break;
}
case 'bufferingEvent':
{
players[id]!.bufferingProgress = event[2];
if (!players[id]!.bufferingProgressController.isClosed)
players[id]!
.bufferingProgressController
.add(players[id]!.bufferingProgress);
break;
}
default:
break;
}
Expand Down
15 changes: 10 additions & 5 deletions ffi/lib/src/player.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,7 @@ import 'dart:io';
import 'dart:async';
import 'package:ffi/ffi.dart';
import 'package:dart_vlc_ffi/dart_vlc_ffi.dart';
import 'package:dart_vlc_ffi/src/equalizer.dart';
import 'package:dart_vlc_ffi/src/internal/ffi.dart';
import 'package:dart_vlc_ffi/src/playerState/playerState.dart';
import 'package:dart_vlc_ffi/src/mediaSource/media.dart';
import 'package:dart_vlc_ffi/src/mediaSource/mediaSource.dart';
import 'package:dart_vlc_ffi/src/device.dart';

/// Represents dimensions of a video.
class VideoDimensions {
Expand Down Expand Up @@ -73,6 +68,12 @@ class Player {
/// Stream to listen to dimensions of currently playing video.
late Stream<VideoDimensions> videoDimensionsStream;

/// Current buffering progress of the [Media].
double bufferingProgress = 0.0;

/// Stream to listen to current buffering progress of the [Media].
late Stream<double> bufferingProgressStream;

/// Creates a new [Player] instance.
///
/// Takes unique id as parameter.
Expand All @@ -95,6 +96,8 @@ class Player {
this.playbackStream = this.playbackController.stream;
this.generalController = StreamController<GeneralState>.broadcast();
this.generalStream = this.generalController.stream;
this.bufferingProgressController = StreamController<double>.broadcast();
this.bufferingProgressStream = this.bufferingProgressController.stream;
if (videoDimensions != null) {
this.videoDimensions = videoDimensions;
}
Expand Down Expand Up @@ -282,6 +285,7 @@ class Player {
this.playbackController.close();
this.generalController.close();
this.videoDimensionsController.close();
this.bufferingProgressController.close();
PlayerFFI.dispose(this.id);
}

Expand All @@ -291,4 +295,5 @@ class Player {
late StreamController<PlaybackState> playbackController;
late StreamController<GeneralState> generalController;
late StreamController<VideoDimensions> videoDimensionsController;
late StreamController<double> bufferingProgressController;
}
1 change: 0 additions & 1 deletion lib/src/widgets/video.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui;
import 'package:flutter/material.dart';
import 'package:dart_vlc_ffi/src/player.dart' hide Player;
import 'package:dart_vlc/dart_vlc.dart';
import 'package:dart_vlc/src/widgets/controls.dart';

Expand Down

0 comments on commit 7c09a6f

Please sign in to comment.