From 662583b30057d70b63f8e1b35e82fc5a51b55078 Mon Sep 17 00:00:00 2001 From: Barrett17 Date: Thu, 21 Feb 2019 16:33:52 +0100 Subject: [PATCH] MediaStreamer: Extend API to support DVD navigation * This is a general review of the code and includes a rework of the sniffing API. --- headers/os/codec/CodecRoster.h | 2 +- headers/os/codec/MediaExtractor.h | 3 ++ headers/os/codec/MediaStreamer.h | 26 +++++++++++- headers/os/codec/Streamer.h | 7 +++- src/kits/codec/CodecRoster.cpp | 5 +-- src/kits/codec/MediaStreamer.cpp | 67 ++++++++++++++++++++++++++----- src/kits/codec/PluginManager.cpp | 6 +-- src/kits/codec/Streamer.cpp | 12 ++++++ src/kits/media/MediaFile.cpp | 3 +- 9 files changed, 111 insertions(+), 20 deletions(-) diff --git a/headers/os/codec/CodecRoster.h b/headers/os/codec/CodecRoster.h index 33535d77b9..c7193d6909 100644 --- a/headers/os/codec/CodecRoster.h +++ b/headers/os/codec/CodecRoster.h @@ -44,7 +44,7 @@ public: static void ReleaseEncoder(BEncoder* encoder); static status_t InstantiateStreamer(BStreamer** streamer, - BUrl url, BDataIO** source); + BUrl url); static void ReleaseStreamer(BStreamer* streamer); static status_t GetDecoderInfo(BDecoder* decoder, diff --git a/headers/os/codec/MediaExtractor.h b/headers/os/codec/MediaExtractor.h index df79b12334..3aad3dd674 100644 --- a/headers/os/codec/MediaExtractor.h +++ b/headers/os/codec/MediaExtractor.h @@ -11,6 +11,7 @@ #include +#include #include @@ -23,6 +24,8 @@ struct stream_info; class BMediaExtractor { public: BMediaExtractor(BDataIO* source, int32 flags); + // TODO + //BMediaExtractor(BMediaStreamer* streamer); ~BMediaExtractor(); status_t InitCheck(); diff --git a/headers/os/codec/MediaStreamer.h b/headers/os/codec/MediaStreamer.h index 5c6e4fe11d..cf1abdcc82 100644 --- a/headers/os/codec/MediaStreamer.h +++ b/headers/os/codec/MediaStreamer.h @@ -6,6 +6,7 @@ #define _MEDIA_STREAMER_H +#include #include #include @@ -18,11 +19,34 @@ public: BMediaStreamer(BUrl url); ~BMediaStreamer(); - status_t CreateAdapter(BDataIO** adapter); + status_t InitCheck() const; + + // TODO: So, it seems since this API was not public, + // the memory ownership is leaved to class users. + // See if this fits our plans, and eventually, move + // this memory management from BMediaFile to BMediaExtractor, + // BMediaWriter and BMediaStreamer. + BMediaIO* Adapter() const; + + // TODO: Don't we need an open in the extractor and writer? + status_t Open(); + void Close(); + bool IsOpened() const; + + //uint32 Capabilities() const; + //status_t GetMetaData(BMetaData* data) const; + //status_t SetHandler(BHandler* handler); + //BHandler* Handler() const; + + void MouseMoved(uint32 x, uint32 y); + void MouseDown(uint32 x, uint32 y); private: BUrl fUrl; BStreamer* fStreamer; + status_t fInitCheck; + + bool fOpened; // No virtual padding needed. Looks like a design decision. // Let's respect that, for now. diff --git a/headers/os/codec/Streamer.h b/headers/os/codec/Streamer.h index 4344cd9517..51819aa011 100644 --- a/headers/os/codec/Streamer.h +++ b/headers/os/codec/Streamer.h @@ -20,7 +20,12 @@ namespace BPrivate { class BStreamer { public: - virtual status_t Sniff(const BUrl& url, BDataIO** source) = 0; + virtual status_t Sniff(const BUrl& url) = 0; + virtual BMediaIO* Adapter() const = 0; + + // Base impl does nothing + virtual void MouseMoved(uint32 x, uint32 y); + virtual void MouseDown(uint32 x, uint32 y); protected: BStreamer(); diff --git a/src/kits/codec/CodecRoster.cpp b/src/kits/codec/CodecRoster.cpp index 7e492b8ca4..69cb0aae05 100644 --- a/src/kits/codec/CodecRoster.cpp +++ b/src/kits/codec/CodecRoster.cpp @@ -101,10 +101,9 @@ BCodecRoster::ReleaseEncoder(BEncoder* encoder) status_t -BCodecRoster::InstantiateStreamer(BStreamer** streamer, BUrl url, - BDataIO** source) +BCodecRoster::InstantiateStreamer(BStreamer** streamer, BUrl url) { - return gPluginManager.CreateStreamer(streamer, url, source); + return gPluginManager.CreateStreamer(streamer, url); } diff --git a/src/kits/codec/MediaStreamer.cpp b/src/kits/codec/MediaStreamer.cpp index 28c8a205d5..69b10d30c8 100644 --- a/src/kits/codec/MediaStreamer.cpp +++ b/src/kits/codec/MediaStreamer.cpp @@ -6,11 +6,12 @@ #include "MediaStreamer.h" +#include + #include #include #include "MediaDebug.h" - #include "PluginManager.h" @@ -19,11 +20,14 @@ namespace BCodecKit { BMediaStreamer::BMediaStreamer(BUrl url) : - fStreamer(NULL) + fUrl(url), + fStreamer(NULL), + fInitCheck(B_OK), + fOpened(false) { + // TODO: ideally we should see if the url IsValid() and + // matches our protocol. CALLED(); - - fUrl = url; } @@ -31,22 +35,67 @@ BMediaStreamer::~BMediaStreamer() { CALLED(); - if (fStreamer != NULL) - gPluginManager.DestroyStreamer(fStreamer); + if (fOpened) + Close(); } status_t -BMediaStreamer::CreateAdapter(BDataIO** adapter) +BMediaStreamer::InitCheck() const +{ + return fInitCheck; +} + + +status_t +BMediaStreamer::Open() { CALLED(); + fOpened = true; + // NOTE: Consider splitting the streamer creation and // sniff in PluginManager. if (fStreamer != NULL) - gPluginManager.DestroyStreamer(fStreamer); + BCodecRoster::ReleaseStreamer(fStreamer); - return gPluginManager.CreateStreamer(&fStreamer, fUrl, adapter); + return BCodecRoster::InstantiateStreamer(&fStreamer, fUrl); +} + + +void +BMediaStreamer::Close() +{ + if (fStreamer != NULL) + BCodecRoster::ReleaseStreamer(fStreamer); +} + + +bool +BMediaStreamer::IsOpened() const +{ + return fOpened; +} + + +BMediaIO* +BMediaStreamer::Adapter() const +{ + return fStreamer->Adapter(); +} + + +void +BMediaStreamer::MouseMoved(uint32 x, uint32 y) +{ + fStreamer->MouseMoved(x, y); +} + + +void +BMediaStreamer::MouseDown(uint32 x, uint32 y) +{ + fStreamer->MouseDown(x, y); } diff --git a/src/kits/codec/PluginManager.cpp b/src/kits/codec/PluginManager.cpp index 4414513c53..a14b6ee58b 100644 --- a/src/kits/codec/PluginManager.cpp +++ b/src/kits/codec/PluginManager.cpp @@ -602,7 +602,7 @@ PluginManager::DestroyEncoder(BEncoder* encoder) status_t -PluginManager::CreateStreamer(BStreamer** streamer, BUrl url, BDataIO** source) +PluginManager::CreateStreamer(BStreamer** streamer, BUrl url) { BAutolock _(fLocker); @@ -645,10 +645,8 @@ PluginManager::CreateStreamer(BStreamer** streamer, BUrl url, BDataIO** source) (*streamer)->fMediaPlugin = plugin; plugin->fRefCount++; - BDataIO* streamSource = NULL; - if ((*streamer)->Sniff(url, &streamSource) == B_OK) { + if ((*streamer)->Sniff(url) == B_OK) { TRACE("PluginManager::CreateStreamer: Sniff success\n"); - *source = streamSource; return B_OK; } diff --git a/src/kits/codec/Streamer.cpp b/src/kits/codec/Streamer.cpp index 5d36b5d072..d3a680617f 100644 --- a/src/kits/codec/Streamer.cpp +++ b/src/kits/codec/Streamer.cpp @@ -22,6 +22,18 @@ BStreamer::~BStreamer() } +void +BStreamer::MouseMoved(uint32 x, uint32 y) +{ +} + + +void +BStreamer::MouseDown(uint32 x, uint32 y) +{ +} + + void BStreamer::_ReservedStreamer1() {} void BStreamer::_ReservedStreamer2() {} void BStreamer::_ReservedStreamer3() {} diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp index 47607bda6c..532c007c15 100644 --- a/src/kits/media/MediaFile.cpp +++ b/src/kits/media/MediaFile.cpp @@ -604,7 +604,8 @@ BMediaFile::_InitStreamer(const BUrl& url, BDataIO** adapter) return; } - fErr = fStreamer->CreateAdapter(adapter); + fErr = fStreamer->Open(); + *adapter = fStreamer->Adapter(); } /*