PROJECT(esplusplayer)
SET(description "new multimedia player, object-oriented model")
SET(PC_NAME "esplusplayer")
-SET(PC_LDFLAGS "-lesplusplayer -lmixer")
-SET(PC_CFLAGS "-I/usr/include/esplusplayer_capi -I/usr/include/mixer")
+SET(PC_LDFLAGS "-lesplusplayer")
+SET(PC_CFLAGS "-I/usr/include/esplusplayer_capi")
SET(INC_DIR ${PROJECT_SOURCE_DIR}/include/)
INCLUDE_DIRECTORIES(${INC_DIR})
+++ /dev/null
-# **PlusPlayer** #\r
- PlusPlayer is a new multimedia player object-oriented designed.\r
-\r
-## Notice \r
- * 18_Plusplayer\r
- - SW High Level Design doc.\r
-\r
-## Goals ##\r
- * Improve maintainability / extensibility / reusability\r
- - object oriented design\r
- - separate the modules into high-variation part and low-variation part\r
- - decoupling between each streaming services\r
- * Simplification\r
- - simplified pipeline , creates static pipeline\r
- * Easy to upgrade\r
- - support downloadable features (planned)\r
-\r
-## Architecture Design ##\r
- * PlusPlayer consists of TypeFinder / TrackSource / TrackRenderer / DefaultPlayer objects.\r
- * TypeFinder\r
- - Probing source type by inspecting probing data\r
- - use gstreamer typefinder plugin\r
- * TrackSource\r
- - Fetching data from server , demuxing , controling demuxed packet buffers\r
- - a pipeline consists of `src - typefinder - demuxer - multiqueue - inputselector - fakesink`\r
- - plz refer to `${plusplayer_workspace}/docs/dot/plusplayer_src_start.png`\r
- * TrackRenderer\r
- - maintains a pipeline consists of `appsrc - omx - sink` elements\r
- - plz refer to `${plusplayer_workspace}/docs/dot/plusplayer_renderer_start.png`\r
- * Class diagram\r
- * ${plusplayer_workspace}/docs/class_diagram.plantuml\r
- * or you can directly download it from [class_diagram.plantuml]\r
-\r
-## Development ##\r
- * GitHub Project :\r
- * All the milestones / activities (Codes , CodeReview , Design , Issues , etc) are being uploaded here\r
- * Codereview on Github\r
- - Each Developers should fork master branch and work on their own forked project.\r
- - developer should submit pull-request to apply their changes\r
- * all developers must sync their forked project with the latest master prior to sumit pull-request. so that we can avoid merge conflicts.\r
- - everyone can join the codereviews\r
- * the coding style follows Google C++ coding style guide. refer to [CODING STYLE](### coding-style)\r
- * Test Driven Development (use gtest - plusplayer_ut -for their implementation and verifications)\r
-\r
-#### GTest guide ####\r
- * To write Unit test case for PlusPlayer\r
- * docs/gtest_guide.md\r
- * Check Reference section of above link for more detailed documents.\r
- * example\r
- ```\r
- sh-3.2# plusplayer_ut --gtest_filter="AvPlusPlayerTest.play"\r
- ```\r
-\r
-#### Coding Rule Check ####\r
- * check your coding style using **cpplint.py** before uploading your codes\r
- > e.g) $ **cpplint.py** cpp_style_test.cpp\r
- * Or check your coding style and fix your codes automatically using **clang-format**\r
- > e.g) $ **clang-format-3.4** cpp_style_test.cpp -style=google **-i** \r
-\r
-#### Build ####\r
- > 1. Clone or Download plusplayer package.\r
- > 2. $ gbs -c ~/gbsconf/gbs_3_0.conf build -A armv7l --include-all --clean -B ~/GBS_ROOT_PLUSPLAYER \r
-\r
-#### Understanding the codes ####\r
- to understand PlusPlayer concept quickly\r
- plz refer to \r
- - ${plusplayer_workspace}/ut/porting/webapi-plugins-avplay/src/avplusplayer.cc/h \r
- - ${plusplayer_workspace}/src/player/defaultplayer.cpp/h\r
- - ${plusplayer_workspace}/docs/class_diagram.txt\r
-\r
-#### CODING STYLE ####\r
- 'Google C++ Style Guide' based coding. \r
- > Translated(Korean)\r
- > Original(English): [https://google.github.io/styleguide/cppguide.html](https://google.github.io/styleguide/cppguide.html)\r
+++ /dev/null
-export BMS_SERVICE_DIR=~/bms-service\r
-\r
-#rm -f ./*build.log\r
-tizen clean -- ./src/plusplayer-core\r
-tizen clean -- ./src/tracksource\r
-tizen clean -- ./src/plusplayer\r
-\r
-#Debug mode\r
-#tizen build-native -C Debug -a arm -- ./plusplayer-core -j 16 > plusplayer-core-build.log\r
-tizen build-native -C Debug -a arm -c gcc -- ./src/plusplayer-core\r
-tizen build-native -C Debug -a arm -c gcc -- ./src/tracksource\r
-tizen build-native -C Debug -a arm -c gcc -- ./src/plusplayer\r
-\r
-tizen cli-config "profiles.path=`eval echo $HOME`/tizen-studio-data/profile/profiles.xml"\r
-tizen security-profiles add -n ABS -a packaging/author_test.p12 -p author_test -d packaging/tizen-distributor-partner-manufacturer-signer.p12 -dp tizenpkcs12passfordsigner\r
-\r
-#Release mode\r
-tizen build-native -C Release -a arm -c gcc -- ./src/plusplayer-core\r
-tizen build-native -C Release -a arm -c gcc -- ./src/tracksource\r
-tizen build-native -C Release -a arm -c gcc -- ./src/plusplayer\r
-\r
-tizen cli-config "profiles.path=`eval echo $HOME`/tizen-studio-data/profile/profiles.xml"\r
-tizen security-profiles add -n ABS -a packaging/author_test.p12 -p author_test -d packaging/tizen-distributor-partner-manufacturer-signer.p12 -dp tizenpkcs12passfordsigner\r
-\r
-rm -rf ${BMS_SERVICE_DIR}/plusplayer-api/*\r
-cp -rf ./include/plusplayer ${BMS_SERVICE_DIR}/plusplayer-api\r
-cp -vf ./src/plusplayer-core/Release/libplusplayercore_tvplus.so ${BMS_SERVICE_DIR}/lib/\r
-cp -vf ./src/tracksource/Release/libtracksource_tvplus.so ${BMS_SERVICE_DIR}/lib/ \r
-cp -vf ./src/plusplayer/Release/libplusplayer_tvplus.so ${BMS_SERVICE_DIR}/lib/\r
-cp -vf ./config/tvplus/plusplayer.ini ${BMS_SERVICE_DIR}/res/\r
-\r
-tizen clean -- ./src/plusplayer-core\r
-tizen clean -- ./src/tracksource\r
-tizen clean -- ./src/plusplayer\r
+++ /dev/null
-@startuml\r
-\r
-note "AS-IS" as PAGE1 #99FF99\r
-\r
-class PCTask {\r
- # virtual bool t_OnEvent();\r
- # virtual bool t_Create(void);\r
- # virtual void t_Destroy(void);\r
-}\r
-\r
-interface IPlayer {\r
- virtual bool Play()=0;\r
- virtual bool Stop()=0;\r
- virtual bool Pause()=0;\r
- virtual bool Resume()=0;\r
-}\r
-\r
-interface IAVPlayHelper {\r
- + virtual bool IsShutdown() = 0;\r
- + virtual bool HandleOnEvent(const TSEvent* pEvent) = 0; \r
- + virtual bool GetPlayTime(unsigned long& time) = 0;\r
- + virtual bool GetCurrentPlayProgram(std::string& outData) = 0;\r
- + virtual void GetDuration(int& pDuration) = 0;\r
-}\r
-\r
-class TCAVPlayer {\r
- - IAVPlayHelper* m_pAVCurrentHelper;\r
-\r
- - IAVPlayHelper* m_pTVPlusAVPlayHelper;\r
- - IAVPlayHelper* m_pATSC30Helper;\r
-}\r
-note top : "BmsAvPlayer.h"\r
-\r
-IPlayer <|-- TCAVPlayer\r
-PCTask <|-- TCAVPlayer\r
-\r
-TCAVPlayer o-- TvplusAVPlayHelper\r
-TCAVPlayer o-- ATSC3AVPlayHelper\r
-\r
-class TvplusAVPlayHelper {\r
-}\r
-\r
-IAVPlayHelper <|-- TvplusAVPlayHelper\r
-\r
-class ATSC3AVPlayHelper {\r
-}\r
-\r
-IAVPlayHelper <|-- ATSC3AVPlayHelper\r
-\r
-\r
-package "capi-media-player" {\r
-}\r
-\r
-package "libmmplayer" {\r
-}\r
-\r
-TvplusAVPlayHelper --> "capi-media-player"\r
-ATSC3AVPlayHelper --> "capi-media-player"\r
-\r
-"capi-media-player" --> "libmmplayer"\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-note "TO-BE" as PAGE1 #99FF99\r
-\r
-package "plusplayer" {\r
-}\r
-\r
-package "bms-service" {\r
-\r
-class PCTask {\r
- # virtual bool t_OnEvent();\r
- # virtual bool t_Create(void);\r
- # virtual void t_Destroy(void);\r
-}\r
-\r
-interface IPlayer {\r
- virtual bool Play()=0;\r
- virtual bool Stop()=0;\r
- virtual bool Pause()=0;\r
- virtual bool Resume()=0;\r
-}\r
-\r
-interface IAVPlayHelper {\r
- + virtual bool IsShutdown() = 0;\r
- + virtual bool HandleOnEvent(const TSEvent* pEvent) = 0; \r
- + virtual bool GetPlayTime(unsigned long& time) = 0;\r
- + virtual bool GetCurrentPlayProgram(std::string& outData) = 0;\r
- + virtual void GetDuration(int& pDuration) = 0;\r
-}\r
-\r
-class TCAVPlayer {\r
- - IAVPlayHelper* m_pAVCurrentHelper;\r
-\r
- - IAVPlayHelper* m_pTVPlusAVPlayHelper;\r
- - IAVPlayHelper* m_pATSC30Helper;\r
-}\r
-note top of TCAVPlayer : "BmsAvPlayer.h"\r
-\r
-IPlayer <|-- TCAVPlayer\r
-PCTask <|-- TCAVPlayer\r
-\r
-TCAVPlayer o-- TvplusPlusplayerHelper\r
-TCAVPlayer o-- ATSC3PlusplayerHelper\r
-\r
-class TvplusPlusplayerHelper {\r
-}\r
-\r
-IAVPlayHelper <|-- TvplusPlusplayerHelper\r
-\r
-class ATSC3PlusplayerHelper {\r
-}\r
-\r
-IAVPlayHelper <|-- ATSC3PlusplayerHelper\r
-\r
-}\r
-\r
-TvplusPlusplayerHelper *--> "plusplayer"\r
-ATSC3PlusplayerHelper *--> "plusplayer"\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title TrackRenderer Adapter\r
-\r
-DefaultPlayer *-- TrackRendererAdapter\r
-class TrackRendererAdapter\r
-note left : RAII container of Trackrenderer instance.\r
-TrackRendererAdapter --> TrackRendererCapi\r
-TrackRendererCapi --> TrackRenderer\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title AS-IS\r
-\r
-package "capi-media-player" {\r
-}\r
-\r
-package "webapi-plugins-avplay" {\r
- class AVPlayInstance {\r
- }\r
-\r
- class AVPlayerAdapter {\r
- }\r
-}\r
-\r
-package "webapi-plugins-avplay" {\r
- class AVPlayInstance {\r
- }\r
-\r
- class AVPlayerAdapter {\r
- }\r
-\r
- AVPlayInstance *-- AVPlayerAdapter\r
- AVPlayerAdapter *--> "capi-media-player"\r
-}\r
-\r
-newpage\r
-\r
-title TO-BE\r
-\r
-package "capi-media-player" {\r
-}\r
-\r
-package "webapi-plugins-avplay" {\r
- class AVPlayInstance {\r
- }\r
-\r
- class AVPlayerAdapter {\r
- }\r
-\r
- interface AvPlay {\r
- }\r
-\r
- AVPlayInstance *-- AvPlay\r
- AvPlay <|.. AVPlayerAdapter\r
- AVPlayerAdapter *-- "capi-media-player"\r
- AvPlay <|.. AvPlusPlayer\r
- PlusPlayerEventListener --* AvPlusPlayer\r
-}\r
-\r
-package "plusplayer" {\r
-}\r
-\r
-AvPlusPlayer *--> "plusplayer" : use\r
-\r
-@enduml@startuml\r
-\r
-package "webapi-plugins-avplay" {\r
- class AVPlayInstance {\r
- }\r
-\r
- class AVPlayerAdapter {\r
- }\r
-\r
- interface AvPlay {\r
- }\r
-\r
- AVPlayInstance *-- AvPlay\r
- AvPlay <|.. AVPlayerAdapter\r
- AVPlayerAdapter *-- "capi-media-player"\r
- AvPlay <|.. AvPlusPlayer\r
- PlusPlayerEventListener --* AvPlusPlayer\r
-}\r
-\r
-package "plusplayer" {\r
-}\r
-\r
-AvPlusPlayer *--> "plusplayer" : use\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-'HTML5 VideoTag case\r
-package "webmedia" {\r
- class OriginalMediaPort {\r
- }\r
- interface MediaPort {\r
- }\r
- class PlusPlayerMediaPort {\r
- /' Adapter '/\r
- }\r
- MediaPort <|.. OriginalMediaPort\r
- MediaPort <|. PlusPlayerMediaPort\r
- "capi-media-player" --* OriginalMediaPort\r
-}\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-class TvplusPlusplayerHelper {\r
-\r
-}\r
-\r
-package "plusplayer" {\r
-class Plusplayer {\r
-}\r
-}\r
-\r
-class CBmsDrmHandler {\r
-\r
-}\r
-\r
-package "DrmManager" {\r
- class DrmManager {\r
- }\r
-}\r
-\r
-package "IEME" {\r
-\r
-}\r
-\r
-TvplusPlusplayerHelper *-- Plusplayer\r
-TvplusPlusplayerHelper *-- CBmsDrmHandler\r
-CBmsDrmHandler *-- DrmManager\r
-DrmManager --> IEME\r
-Plusplayer --> IEME\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title DefaultPlayer\r
-' DefaultPlayer\r
- interface PlusPlayer {\r
- }\r
- interface TrackSource {\r
- }\r
- PlusPlayer <|.. DefaultPlayer\r
- \r
-' DefaultPlayer\r
- DefaultPlayer "1" *-- "1" StateManager\r
- DefaultPlayer "1" *-- "1" MsgHandler\r
- DefaultPlayer "1" *--- "1" Feeder\r
- DefaultPlayer "1" *--- "1" TypeFinder\r
- DefaultPlayer "1" *--- "1" TrackSourceCompositor\r
- TrackSource <|-- TrackSourceCompositor\r
- DefaultPlayer "1" *--- "1" TrackRenderer\r
- DefaultPlayer "1" *- "1" TrackSourceEventListener\r
- DefaultPlayer "1" *- "1" TrackRendererEventListener\r
- DefaultPlayer ..> Track\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title TrackRenderer\r
-\r
-class TrackRenderer {\r
- + bool Open()\r
- + bool Close()\r
- + bool Prepare()\r
- + bool Start()\r
- + bool Stop()\r
- + void SetDisplayMode()\r
- + bool SetDisplay()\r
- + bool SetDisplayRoi()\r
- + bool SetVisible()\r
- + bool SetTrack()\r
- + bool SubmitPacket(const DecoderInputBufferPtr& data)\r
- + bool GetPlayingTime()\r
-\r
- - std::vector<Track> trackinfo_;\r
- - std::unique_ptr<Pipeline<T>> pipeline_;\r
- - AvocHandle avoc_id_;\r
-\r
-}\r
-\r
-class Display {\r
- + void SetDisplayMode()\r
- + bool SetDisplay()\r
- + bool SetDisplayRoi()\r
- + bool SetVisible()\r
-}\r
-\r
-class DecoderInputBuffer {\r
- - GstBuffer* buffer_\r
-}\r
-\r
-class ResourceManager {\r
- + bool Alloc()\r
- + bool Dealloc()\r
- - static rm_cb_result ResourceConflictCallback_()\r
-}\r
-\r
- DefaultPlayer "1" *-- "1" TrackRenderer\r
- TrackRenderer "1" o-- "1" Display\r
- TrackRenderer *-- ResourceManager\r
- TrackRenderer *-- Track\r
- TrackRenderer ..> DecoderInputBuffer\r
- TrackRenderer *-- Pipeline\r
-\r
- package Gstreamer {\r
- }\r
- Pipeline --> Gstreamer\r
- package Avoc {\r
- }\r
- TrackRenderer --> Avoc\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-' TrackSource\r
-title TrackSource & Compositor\r
-\r
- interface TrackSource {\r
- + virtual bool AddSource()\r
- + virtual bool StopSource()\r
- + virtual bool DeleteSource()\r
- + virtual bool Open()\r
- + virtual bool Close()\r
- + virtual bool Prepare()\r
- + virtual bool Start()\r
- + virtual bool Stop()\r
- + virtual bool Seek()\r
- + virtual bool SelectTrack()\r
- + virtual bool Deactivate()\r
- + virtual bool GetTrackInfo()\r
- + virtual bool GetDuration()\r
- + virtual bool SetBufferConfig()\r
- + virtual bool RegisterListener(DecoderInputBuffer*)\r
- + virtual bool RegisterEventListener(EventListener*)\r
-\r
- }\r
-\r
- class TrackSourceCompositor {\r
- + bool AddSource()\r
- + bool StopSource()\r
- + bool DeleteSource()\r
- }\r
-\r
- class HlsTrackSource {\r
- + bool Open()\r
- + bool Close()\r
- + bool Prepare()\r
- + bool Start()\r
- + bool Stop()\r
- + bool Seek()\r
- }\r
-\r
- class DashTrackSource {\r
- + bool Open()\r
- + bool Close()\r
- + bool Prepare()\r
- + bool Start()\r
- + bool Stop()\r
- + bool Seek()\r
- }\r
-\r
- class HttpTrackSource {\r
- + bool Open()\r
- + bool Close()\r
- + bool Prepare()\r
- + bool Start()\r
- + bool Stop()\r
- + bool Seek()\r
- - GstElement* pipeline;\r
- }\r
-\r
- class ExternalSubtitleSource {\r
- + bool Open()\r
- + bool Close()\r
- + bool Prepare()\r
- + bool Start()\r
- + bool Stop()\r
- + bool Seek()\r
- }\r
-\r
- TrackSource <|.. TrackSourceCompositor\r
- TrackSource <|.. HlsTrackSource\r
- TrackSource <|.. DashTrackSource\r
- TrackSource <|.. HttpTrackSource\r
- TrackSource <|.. ExternalSubtitleSource\r
- TrackSource --o TrackSourceCompositor\r
-\r
- package Gstreamer {\r
- }\r
-\r
- HlsTrackSource --> Gstreamer\r
- DashTrackSource --> Gstreamer\r
- HttpTrackSource --> Gstreamer\r
- ExternalSubtitleSource --> Gstreamer\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-package "esplusplayer" {\r
-\r
- interface EsPlusPlayer {\r
- }\r
-\r
- EsPlusPlayer <|.. EsPlayer\r
-\r
- class EsEventListener {\r
- }\r
-\r
- class AudioStream {\r
- }\r
-\r
- class VideoStream {\r
- }\r
-\r
- class EsPacket {\r
- }\r
-\r
- class TrackRenderer {\r
- }\r
-\r
-' EsPlayer\r
- EsPlayer "1" *-- "1" StateManager\r
- EsPlayer "1" *-- "1" TrackRenderer\r
- EsPlayer "1" *-- "1" MsgHandler\r
- EsPlayer "1" *-- "1" TrackRendererEventListener\r
- EsPlayer ..> AudioStream\r
- EsPlayer ..> VideoStream\r
- EsPlayer ..> EsPacket\r
- EsPlayer ..> Track\r
- EsPlayer --- DecoderInputBuffer\r
- \r
- AudioStream ..> Track \r
- VideoStream ..> Track \r
-\r
-' TrackRenderer\r
- TrackRenderer "1" o--- "1" Display\r
- TrackRenderer *-- ResourceManager\r
- TrackRenderer *-- Track\r
- TrackRenderer ...> DecoderInputBuffer\r
- TrackRenderer *- Pipeline\r
-\r
- Pipeline --> GstObjectGuard\r
- \r
- ResourceManager --> Resource\r
- ResourceManager *-- Resource\r
-}\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-package "plusplayer" {\r
-\r
- interface PlusPlayer {\r
- }\r
-\r
- PlusPlayer <|.. DefaultPlayer\r
-\r
- class TrackRenderer {\r
- }\r
-\r
- ResourceManager --> Resource\r
- ResourceManager *-- Resource\r
-\r
- class DecoderInputBufferListener {\r
- }\r
-\r
- class TrackSourceCompositor {\r
- }\r
-\r
- class TypeFinder {\r
- }\r
-\r
- TypeFinder *-- SourceType\r
- DecoderInputBufferListener <|-- Feeder\r
-\r
-' DefaultPlayer\r
- DefaultPlayer "1" *-- "1" Feeder\r
- DefaultPlayer "1" *- "1" StateManager\r
- DefaultPlayer "1" *-- "1" TypeFinder\r
- DefaultPlayer "1" *-- "1" TrackSourceCompositor\r
- DefaultPlayer "1" *--- "1" TrackRenderer\r
- DefaultPlayer "1" *-- "1" MsgHandler\r
- DefaultPlayer "1" *-- "1" TrackSourceEventListener\r
- DefaultPlayer "1" *-- "1" TrackRendererEventListener\r
- DefaultPlayer ..> Track\r
-\r
-' TrackSource\r
- interface TrackSource {\r
- }\r
-\r
- class HlsTrackSource {\r
- }\r
- TrackSource <|.. TrackSourceCompositor\r
- TrackSource <|.. HlsTrackSource\r
- TrackSource <|.. ExternalSubtitleSource\r
- TrackSource --o TrackSourceCompositor\r
- HlsTrackSource *-- Track\r
- HlsTrackSource --- DecoderInputBuffer\r
- ExternalSubtitleSource --- DecoderInputBuffer\r
-\r
- Pipeline --> GstObjectGuard\r
- HlsTrackSource --> GstObjectGuard\r
- ExternalSubtitleSource --> GstObjectGuard\r
-\r
- TrackRenderer "1" o--- "1" Display\r
- TrackRenderer *-- ResourceManager\r
- TrackRenderer *-- Track\r
- TrackRenderer ...> DecoderInputBuffer\r
- TrackRenderer *- Pipeline\r
-}\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-package "plusplayer" {\r
-\r
- interface PlusPlayer {\r
- }\r
-\r
- PlusPlayer <|.. DefaultPlayer\r
-\r
- class TrackRenderer {\r
- }\r
- DefaultPlayer "1" *-- "1" TrackSourceCompositor\r
- DefaultPlayer "1" *-- "1" TrackRenderer\r
-\r
- class TrackSourceCompositor {\r
- }\r
-\r
-' TrackSource\r
- interface TrackSource {\r
- }\r
-\r
- class HlsTrackSource {\r
- }\r
- TrackSource <|.. TrackSourceCompositor\r
- TrackSource <|.. HlsTrackSource\r
- TrackSource <|.. ExternalSubtitleSource\r
- TrackSource --o TrackSourceCompositor\r
-}\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-## **CODING STYLE** ##\r
- * All codes follow 'Google C++ Style Guide' \r
- - [English](https://google.github.io/styleguide/cppguide.html)\r
- * some major rules are below\r
-\r
----\r
-\r
-### § Naming ###\r
- Give as descriptive a name as possible.\r
- \r
-#### 1. Namespace/File/Variable/Struct Data member ####\r
- * All lower case(mandatory) + between underscore(optional)\r
- * e.g) mediaplayer.h , trackrenderer , track_renderer\r
-\r
-#### 2. Class Data Members\r
- * Private attributes : Variable names + Trailing underscore("_")\r
- * e.g) tablename_ , tracksource_ , track_source_\r
- * Public attributes - Not Allowed.\r
-\r
-#### 3. Type Names - Class,Struct,Type Aliases,Enums and type template parameters ####\r
- * Names start with a capital letter and have a capital letter for each new word\r
- * No Underscore\r
- * e.g) MMPlayer(X) , MmPlayer(O)\r
- * e.g) class MediaPlayer {} ...\r
- * e.g) struct PlayerContext {} , enum SourceType {...}\r
-\r
-#### 4. Macro Names ####\r
- * All capitals + Underscore\r
-\r
-#### 5. Constant / Enumerator ####\r
- * prefix 'k' + TypeNames \r
- * e.g \r
- const int kDaysInAWeek = 7; \r
- enum UrlTableErrors { \r
- kErrorOutOfMemory \r
- } \r
-\r
-### § Formating ###\r
-\r
-#### 1. Indentation ####\r
- * Default indentation : 2 spaces \r
- * We use spaces for indentation. Do not use tabs in your code.\r
-\r
-#### 2. Class ####\r
- * Ordering\r
- * Sections in public - protected - private order\r
- * method(public/protected/private) -> attribute order\r
- * public, protected and private keywords : **1** space indentation\r
-\r
-### § Header Files ###\r
-\r
-#### 1. Order of Includes ####\r
- * Related header, C library, C++ library, other libraries' .h, your project's .h.\r
-\r
-> plz refer to "Google C++ Style Guide" for the rest of detail guide.\r
+++ /dev/null
-@startuml\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-' to be updated soon\r
-' this is test\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-/'\r
-skinparam backgroundColor #EEEBDC\r
-skinparam handwritten true\r
-skinparam sequence {\r
- ArrowColor DeepSkyBlue\r
- ActorBorderColor DeepSkyBlue\r
- LifeLineBorderColor blue\r
- LifeLineBackgroundColor #A9DCDF\r
- ParticipantBorderColor DeepSkyBlue\r
- ParticipantBackgroundColor DodgerBlue\r
- ParticipantFontName Impact\r
- ParticipantFontSize 17\r
- ParticipantFontColor #A9DCDF\r
- ActorBackgroundColor aqua\r
- ActorFontColor DeepSkyBlue\r
- ActorFontSize 17\r
- ActorFontName Aapex\r
-}\r
-'/\r
-\r
-title tvplus case(1) dynamic loading\r
-\r
-participant AppLauncher\r
-participant App\r
-participant BmsService\r
-note over BmsService : daemon\r
-participant Plusplayer\r
-participant PlusplayerLoader\r
-database version_info\r
-\r
-== initialization ==\r
-alt successful case\r
- AppLauncher -> App : load\r
- App -> BmsService : play()\r
- BmsService -> Plusplayer : SetVersion("path")\r
- Plusplayer -> PlusplayerLoader : SetVersion("path")\r
- PlusplayerLoader -> version_info : ReadVersion()\r
- ' 한번에 모두 로딩 or 분할하여.\r
- PlusplayerLoader -> PlusplayerLoader : LoadProperLibSet_()\r
- BmsService -> Plusplayer : Create()\r
-else some kind of failure (version mismatch or missing)\r
-end\r
-\r
-newpage tvplus case(2) dynamic linking\r
-\r
-actor PlayerManager\r
-participant ServiceDaemonLauncher\r
-participant App\r
-participant BmsService\r
-note over BmsService : daemon\r
-participant Plusplayer\r
-participant PlusplayerLoader\r
-database version_info\r
-\r
-\r
-== initialization ==\r
-\r
-group compile time\r
- PlayerManager -> BmsService : update LD_PRELOAD configuration\r
- note over BmsService : adjust bms.service configuration file\r
-end\r
-\r
-alt successful case\r
- ServiceDaemonLauncher -> BmsService : load\r
- note over BmsService : updated libs are dynamically linked\r
- App -> BmsService : play()\r
- BmsService -> Plusplayer : SetVersion("path")\r
- Plusplayer -> PlusplayerLoader : GetVersion("path")\r
- PlusplayerLoader -> version_info : ReadVersion()\r
- PlusplayerLoader -> PlusplayerLoader : CheckLibValidation_()\r
- Plusplayer <-- PlusplayerLoader : success\r
- BmsService -> Plusplayer : Create()\r
-else some kind of failure (version mismatch or missing)\r
-end\r
-\r
-\r
-\r
-@enduml\r
+++ /dev/null
-**GTest guide** \r
-===============\r
- For unit test for plusplayer\r
-\r
----\r
-### Reference \r
-- <https://github.com/google/googletest>\r
-\r
-## Assertion \r
-* ASSERT_* : 실패시 해당 테스트를 바로 종료 <br>\r
-* EXPECT_* : 실패하여도 테스트 계속 진행 <br>\r
-\r
-#### Basic Assertions ###\r
-\r
-These assertions do basic true/false condition testing.\r
-\r
-| **Fatal assertion** | **Nonfatal assertion** | **Verifies** |\r
-|:--------------------|:-----------------------|:-------------|\r
-| `ASSERT_TRUE(`_condition_`)`; | `EXPECT_TRUE(`_condition_`)`; | _condition_ is true |\r
-| `ASSERT_FALSE(`_condition_`)`; | `EXPECT_FALSE(`_condition_`)`; | _condition_ is false |\r
-\r
-#### Binary Comparison ###\r
-\r
-This section describes assertions that compare two values.\r
-\r
-| **Fatal assertion** | **Nonfatal assertion** | **Verifies** |\r
-|:--------------------|:-----------------------|:-------------|\r
-|`ASSERT_EQ(`_val1_`, `_val2_`);`|`EXPECT_EQ(`_val1_`, `_val2_`);`| _val1_ `==` _val2_ |\r
-|`ASSERT_NE(`_val1_`, `_val2_`);`|`EXPECT_NE(`_val1_`, `_val2_`);`| _val1_ `!=` _val2_ |\r
-|`ASSERT_LT(`_val1_`, `_val2_`);`|`EXPECT_LT(`_val1_`, `_val2_`);`| _val1_ `<` _val2_ |\r
-|`ASSERT_LE(`_val1_`, `_val2_`);`|`EXPECT_LE(`_val1_`, `_val2_`);`| _val1_ `<=` _val2_ |\r
-|`ASSERT_GT(`_val1_`, `_val2_`);`|`EXPECT_GT(`_val1_`, `_val2_`);`| _val1_ `>` _val2_ |\r
-|`ASSERT_GE(`_val1_`, `_val2_`);`|`EXPECT_GE(`_val1_`, `_val2_`);`| _val1_ `>=` _val2_ |\r
-\r
-\r
-#### String Comparison ###\r
-\r
-The assertions in this group compare two **C strings**.<br>\r
-If you want to compare two `string` objects, use `EXPECT_EQ`, `EXPECT_NE`, and etc instead.\r
-\r
-| **Fatal assertion** | **Nonfatal assertion** | **Verifies** |\r
-|:--------------------|:-----------------------|:-------------|\r
-| `ASSERT_STREQ(`_str1_`, `_str2_`);` | `EXPECT_STREQ(`_str1_`, `_str_2`);` | the two C strings have the same content |\r
-| `ASSERT_STRNE(`_str1_`, `_str2_`);` | `EXPECT_STRNE(`_str1_`, `_str2_`);` | the two C strings have different content |\r
-| `ASSERT_STRCASEEQ(`_str1_`, `_str2_`);`| `EXPECT_STRCASEEQ(`_str1_`, `_str2_`);` | the two C strings have the same content, ignoring case |\r
-| `ASSERT_STRCASENE(`_str1_`, `_str2_`);`| `EXPECT_STRCASENE(`_str1_`, `_str2_`);` | the two C strings have different content, ignoring case |\r
-\r
-## Text Fixtures : Using the Same Data Configuration for Multiple Tests ##\r
-\r
-사용자가 유사한 data를 사용해서 하나 이상의 test를 작성한다면, test fixture를 사용할 수 있다. 이 test fixture를 사용한다는 것은 여러개의 다양한 test를 작성하는 과정에서 같은 object의 configuration을 재사용한다는 것을 의미한다.\r
-\r
-Fixture를 작성할 때에는 아래의 내용대로 수행하면 된다.\r
-\r
-1. ::testing::Test 로부터 class를 derive한다. Sub-class 에서 fixture member에 접근해야 하기 때문에 protected 혹은 public 으로 작성해야 한다. \r
-2. Class 내부에서 사용자가 원하는대로 object들을 선언해 사용한다. \r
-3. 필요하다면, 생성자나 SetUp() function을 작성해둔다. \r
-4. 생성자나 SetUp() function을 정의해서 사용하고 있다면, 해당 function에서 사용했던 resource를 반환하기 위해 소멸자나 TearDown() function을 작성한다. \r
-5. Subroutine 들을 작성한다. \r
-\r
-Fixture를 사용하기 위해서는 TEST() 대신에 TEST_F()를 사용해야만 한다.\r
-TEST()에서는 첫번째 argument가 testcase의 이름이었지만 TEST_F()를 사용할 때는 첫번째 argument로 test fixture class의 이름을 사용해야만 한다.\r
-\r
-**Fixture class 기본 구현 Form**\r
-* 관례에 따라 테스트할 클래스가 Foo라면 이름을 FooTest라고 하는게 좋다.\r
-~~~\r
-class PlusPlayerTest : public ::testing::Test {\r
-public:\r
- PlusPlayerTest(std::string url)\r
- : plusplayer_(nullptr), url_(url)\r
- {\r
- }\r
-\r
- void SetUp() override\r
- {\r
- plusplayer_ = new PlusPlayer();\r
- create(url_);\r
- }\r
-\r
- void TearDown() override\r
- {\r
- destory(plusplayer_);\r
- }\r
-\r
-private:\r
- std::string url_;\r
- PlusPlayer* plusplayer_;\r
-\r
-}\r
-~~~\r
-\r
-**실행 순서** \r
-1. 모든 구글 테스트 플래그 상태를 저장한다. \r
-2. 첫 번째 테스트에 대해 테스트 fixture 객체를 생성한다. \r
-3. 만든 객체를 SetUp()에서 초기화한다. \r
-4. 픽스처 객체에 대해 테스트를 실행한다. \r
-5. TearDown()에서 해당 픽스처를 정리한다. \r
-6. 해당 픽스처를 삭제한다. \r
-7. 모든 구글 테스트 플래그 상태를 복원한다. \r
-8. 모든 테스트를 마칠 때까지 다음 테스트에 대해 위 과정을 반복한다. \r
-\r
----\r
-\r
-## Arguments \r
-reference\r
-\r
-1. test selection\r
- * --gtest_list_tests <br>\r
- > 테스트할 항목을 보여준다. (테스트 실시 X)\r
- * --gtest_also_run_disabled_tests <br>\r
- > DISABLED_ 로 막아둔 test case 를 일시적으로 실행\r
- * --gtest_filter <br>\r
- > 특정 case 들만 실행 가능<br>\r
- Ex) --gtest_filter="*.create*" : 모든 TC중에서 create 로 시작하는 모든 TC 실행. <br>\r
-\r
-2. test Execution\r
- * --gtest_repeat <br>\r
- > test 반복 가능. -1일 경우 무한히 반복<br>\r
- --gtest_break_on_failure와 함께 사용하면 실패할 경우 멈춤.\r
- * --gtest_shuffle <br>\r
- > 무작위로 실행 가능 (test case 간 dependency 가 없어야 하기 때문이다)<br>\r
- gtest는 기본적으로 현재시간을 랜덤함수의 시드값으로 사용하나, --gtest_random_seed로 조절가능하다\r
- * --gtest_random_seed \r
- > 1 ~ 99999까지의 값을 --gtest_shuffle에서 사용할 랜덤함수의 시드로 사용.\r
-\r
----\r
-## Reference\r
- * Gtest Primer(EN)<br> <https://github.com/google/googletest/blob/master/googletest/docs/Primer.md>\r
+++ /dev/null
-@startuml\r
-\r
-title reduced downloadable module size by libav-common\n dash/hls/http streaming module 9M to 4.5M 50% decreased\r
-\r
-component "dash gst-plugin" as dash\r
-component "hls gst-plugin" as hls\r
-component "httpdemux gst-plugin" as http\r
-\r
-component "libavformat-dash.so" as dashformat\r
-component "libavformat-hls.so" as hlsformat\r
-component "libavformat-httpdemux.so" as httpformat\r
-\r
-package "libav-common" as libavcommon {\r
- [libavcodec.so]\r
- [libavutils.so]\r
-}\r
-\r
-dash --> dashformat : use\r
-http --> httpformat : use\r
-hls --> hlsformat : use\r
-\r
-dashformat --> libavcommon : use\r
-httpformat --> libavcommon : use\r
-hlsformat --> libavcommon : use\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title : module view : uses view\r
-\r
-component [Downloadable module] #Aquamarine\r
-\r
-package "Security" {\r
- IEME -- [EME]\r
-}\r
-package "System" {\r
- package "Subsystem" {\r
- RM -- [ResourceManager]\r
- }\r
-\r
- package "Subsystem" {\r
- AVOC -- [libavoc]\r
- }\r
-}\r
-\r
-package "EFL" {\r
- ecore_wayland_api -- [Ecore_Wayland]\r
-}\r
-\r
-package "Gstreamer" {\r
- [gstreamer] --> [gst-openmax]\r
- package "gst-plugins-streamingengine" {\r
- [gst-plugin-dash] #Aquamarine\r
- [gst-plugin-hls] #Aquamarine\r
- [gst-plugin-http] #Aquamarine\r
- [gstreamer] --> [gst-plugin-dash]\r
- [gstreamer] --> [gst-plugin-hls]\r
- [gstreamer] --> [gst-plugin-http]\r
- }\r
-}\r
-\r
-package "Plusplayer" {\r
- [plusplayer] #Aquamarine\r
- [tracksource] #Aquamarine\r
- [plusplayer-core] #Aquamarine\r
- [plusplayer] --> [tracksource] : use\r
- [plusplayer] --> [trackrenderer] : use\r
- [plusplayer] --> [plusplayer-core] : use\r
- [tracksource] --> [plusplayer-core] : use\r
- '[tracksource] --> [gstreamer] : use\r
- [trackrenderer] --> [plusplayer-core] : use\r
- [trackrenderer] --> RM : use\r
- '[trackrenderer] --> [gstreamer] : use\r
- [trackrenderer] --> [ecore_wayland_api] : use\r
- [trackrenderer] --> [AVOC] : use\r
- [trackrenderer] --> [IEME] : use\r
- [plusplayer-core] --> [gstreamer] : use\r
-}\r
-\r
-\r
-package "drmmanager" {\r
- drmapi -- [DrmManager]\r
- [DrmManager] --> [IEME] : use\r
-}\r
-\r
-package "webapi-avplay" {\r
- [avplay] --> [plusplayer]\r
- [avplay] --> [drmapi]\r
-}\r
-\r
-package "bms-service" {\r
- [BmsAVPlayer] --> [plusplayer]\r
- [BmsAVPlayer] --> [drmapi]\r
-}\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-# **PlusPlayer** #\r
- PlusPlayer is a new multimedia player object-oriented designed.\r
-\r
-## Goals ##\r
- * Improve maintainability / extensibility / reusability\r
- - object oriented design\r
- - separate the modules into high-variation part and low-variation part\r
- - decoupling between each streaming services\r
- * Simplification\r
- - simplified pipeline , creates static pipeline\r
- * Easy to upgrade\r
- - support downloadable features (planned)\r
-\r
-## Architecture Design ##\r
- * PlusPlayer consists of TypeFinder / TrackSource / TrackRenderer / DefaultPlayer objects.\r
- * TypeFinder\r
- - Probing source type by inspecting probing data\r
- - use gstreamer typefinder plugin\r
- * TrackSource\r
- - Fetching data from server , demuxing , controling demuxed packet buffers\r
- - a pipeline consists of `src - typefinder - demuxer - multiqueue - inputselector - fakesink`\r
- - plz refer to `${plusplayer_workspace}/docs/dot/plusplayer_src_start.png`\r
- * TrackRenderer\r
- - maintains a pipeline consists of `appsrc - omx - sink` elements\r
- - plz refer to `${plusplayer_workspace}/docs/dot/plusplayer_renderer_start.png`\r
- * Class diagram\r
- * ${plusplayer_workspace}/docs/class_diagram.plantuml\r
- * or you can directly download it from [class_diagram.plantuml]\r
-\r
-## Development ##\r
- * GitHub Project :\r
- * All the milestones / activities (Codes , CodeReview , Design , Issues , etc) are being uploaded here\r
- * Codereview on Github\r
- - Each Developers should fork master branch and work on their own forked project.\r
- - developer should submit pull-request to apply their changes\r
- * all developers must sync their forked project with the latest master prior to sumit pull-request. so that we can avoid merge conflicts.\r
- - everyone can join the codereviews\r
- * the coding style follows Google C++ coding style guide. refer to [CODING STYLE](### coding-style)\r
- * Test Driven Development (use gtest - plusplayer_ut -for their implementation and verifications)\r
-\r
-#### GTest guide ####\r
- * To write Unit test case for PlusPlayer\r
- * docs/gtest_guide.md\r
- * Check Reference section of above link for more detailed documents.\r
- * example\r
- ```\r
- sh-3.2# plusplayer_ut --gtest_filter="AvPlusPlayerTest.play"\r
- ```\r
-#### Coding Rule Check ####\r
- * check your coding style using **cpplint.py** before uploading your codes\r
- > e.g) $ **cpplint.py** cpp_style_test.cpp\r
- * Or check your coding style and fix your codes automatically using **clang-format**\r
- > e.g) $ **clang-format-3.4** cpp_style_test.cpp -style=google **-i** \r
-\r
-#### Build ####\r
- > 1. Clone or Download plusplayer package.\r
- > 2. $ gbs -c ~/gbsconf/gbs_3_0.conf build -A armv7l --include-all --clean -B ~/GBS_ROOT_PLUSPLAYER \r
-\r
-#### Understanding the codes ####\r
- to understand PlusPlayer concept quickly\r
- plz refer to \r
- - ${plusplayer_workspace}/ut/porting/webapi-plugins-avplay/src/avplusplayer.cc/h \r
- - ${plusplayer_workspace}/src/player/defaultplayer.cpp/h\r
- - ${plusplayer_workspace}/docs/class_diagram.txt\r
-\r
-#### CODING STYLE ####\r
- 'Google C++ Style Guide' based coding. \r
- > Translated(Korean)\r
- > Original(English): [https://google.github.io/styleguide/cppguide.html](https://google.github.io/styleguide/cppguide.html)\r
+++ /dev/null
-@startuml\r
-\r
-actor App\r
-boundary AvPlayInstance\r
-\r
-App -> AvPlayInstance : AVPlayOpen(url)\r
-note left : request playback\r
-AvPlayInstance -> AvPlusPlayer : Open(url)\r
-AvPlusPlayer -> Plusplayer : Open(url)\r
-AvPlusPlayer -> Plusplayer : RegisterEventListener()\r
-\r
-App -> AvPlayInstance : AVPlaySetBufferingParam()\r
-AvPlayInstance -> AvPlusPlayer : setBufferingParam()\r
-AvPlusPlayer -> Plusplayer : SetBufferConfig()\r
-App -> AvPlayInstance : AVPlaySetDisplayRect()\r
-AvPlayInstance -> AvPlusPlayer : SetOutputArea()\r
-AvPlusPlayer -> Plusplayer : SetDisplayMode()\r
-AvPlusPlayer -> Plusplayer : SetDisplayRoi()\r
-AvPlusPlayer -> Plusplayer : SetDisplay(Evas_Object*)\r
-App -> AvPlayInstance : AVPlaySetStreamingProperty()\r
-AvPlayInstance -> AvPlusPlayer : SetStreamingProperty()\r
-AvPlusPlayer -> Plusplayer : SetStreamingProperty()\r
-\r
-App -> AvPlayInstance : AVPlayPrepare()\r
-AvPlayInstance -> AvPlusPlayer : prepareAsync()\r
-AvPlusPlayer -> Plusplayer : PrepareAsync()\r
-Plusplayer --> AvPlusPlayer : OnPrepareDone(ret)\r
-AvPlusPlayer --> AvPlayInstance : onAsyncEventComplete()\r
-App -> AvPlayInstance : AVPlayPlay()\r
-AvPlayInstance -> AvPlusPlayer : play()\r
-AvPlusPlayer -> Plusplayer : Start()\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title dash_drm_playback_base_flow_1\r
-\r
-BmsAvPlayer -> TvplusPlusplayerAdapter : m_Play()\r
-TvplusPlusplayerAdapter -> CBmsDrmHandler : StoreDrmInfo()\r
-activate CBmsDrmHandler\r
-CBmsDrmHandler -> DrmManager : DMGRCreateDRMSession(DRM_TYPE_EME)\r
-CBmsDrmHandler -> DrmManager : DMGRSetDRMLocalMode()\r
-DrmManager -> IEME : create_session()\r
-IEME --> DrmManager : drm_handle*\r
-DrmManager --> CBmsDrmHandler : return\r
-CBmsDrmHandler --> TvplusPlusplayerAdapter : return\r
-deactivate CBmsDrmHandler\r
-TvplusPlusplayerAdapter -> CBmsDrmHandler : GetDrmHandle()\r
-CBmsDrmHandler --> TvplusPlusplayerAdapter : drm_handle*\r
-TvplusPlusplayerAdapter -> Plusplayer : SetDrm(DrmInfo)\r
-Plusplayer -> TrackRenderer : SetDrmInfo(DrmInfo)\r
-TvplusPlusplayerAdapter -> Plusplayer : PrepareAsync()\r
-Plusplayer -> TrackRenderer : Prepare()\r
-activate TrackRenderer\r
-group CreatePipeline\r
- TrackRenderer -> Gstreamer : factory_make(appsrc)\r
- TrackRenderer -> Gstreamer : factory_make(drm_eme)\r
- TrackRenderer --> DrmEme : g_object_set(DrmInitData_Callback)\r
- TrackRenderer -> Gstreamer : factory_make(omx_decoder)\r
- TrackRenderer -> Gstreamer : factory_make(sink)\r
- TrackRenderer -> Gstreamer : set_state(GST_STATE_PAUSE)(async)\r
- TrackRenderer -> TrackRenderer : wait state_changed\r
- activate TrackRenderer #DarkSalmon\r
- DrmEme --> TrackRenderer : DrmInitData_Callback(init_data)\r
- TrackRenderer --> Plusplayer : OnDrmInitData(init_data, tracktype)\r
- Plusplayer --> TvplusPlusplayerAdapter : OnDrmInitData(init_data, tracktype)\r
- activate TvplusPlusplayerAdapter\r
- TvplusPlusplayerAdapter -> CBmsDrmHandler : SetDrmInitData(init_data)\r
- activate CBmsDrmHandler\r
- CBmsDrmHandler -> DrmManager : DMGRSetDrmInitData(init_data)\r
- DrmManager --> CBmsDrmHandler : return\r
- CBmsDrmHandler --> TvplusPlusplayerAdapter : return\r
- deactivate CBmsDrmHandler\r
- TvplusPlusplayerAdapter -> Plusplayer : DrmLicenseAcquiredDone(tracktype)\r
- deactivate TvplusPlusplayerAdapter\r
- Plusplayer -> TrackRenderer : DrmLicenseAcquiredDone(tractype)\r
- TrackRenderer -> DrmEme : g_object_set(getrights-complete-return)\r
- DrmEme --> Gstreamer : state_changed\r
- Gstreamer --> TrackRenderer : state_changed\r
- deactivate TrackRenderer\r
-end\r
-TrackRenderer -> Plusplayer : return\r
-deactivate TrackRenderer\r
-Plusplayer --> TvplusPlusplayerAdapter : OnPrepareDone(ret)\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-ref over BmsAVPlayer, TvplusPlusplayerHelper, Plusplayer\r
-playing previous channel\r
-end ref\r
-\r
-BmsAVPlayer -> TvplusPlusplayerHelper : m_PlayPosition()\r
-note left : request channel change\r
-TvplusPlusplayerHelper -> TvplusPlusplayerHelper : compare codec info\r
-alt if codec info is same\r
-TvplusPlusplayerHelper -> Plusplayer : ChangeSource(url,resume_time)\r
-Plusplayer -> StateManager : ProcessEvent(StopSource)\r
-StateManager -> TrackSourceCompositor : StopSource(type)\r
-TrackSourceCompositor -> HlSTrackSource : Stop()\r
-TrackSourceCompositor --> StateManager : ret\r
-StateManager -> MetaStateMachine : request state to SourceStopped\r
-MetaStateMachine -> StateManager : state changed\r
-StateManager -> TrackSourceCompositor : DeleteSource(type)\r
-TrackSourceCompositor -> HlSTrackSource : <<destroy>>\r
-destroy HlSTrackSource\r
-TrackSourceCompositor --> StateManager : ret\r
-StateManager --> Plusplayer : done\r
-Plusplayer -> ChangeSourceTask : create task\r
-ChangeSourceTask -> StateManager : ProcessEvent(InitializeSource)\r
-StateManager -> TrackSourceCompositor : AddSource(type)\r
-create DashTrackSource\r
-TrackSourceCompositor -> DashTrackSource : <<create>>\r
-StateManager --> ChangeSourceTask : ret\r
-ChangeSourceTask -> StateManager : ProcessEvent(PrepareSource)\r
-StateManager -> TrackSourceCompositor : Prepare()\r
-TrackSourceCompositor -> DashTrackSource : Prepare()\r
-StateManager --> ChangeSourceTask : ret\r
-ChangeSourceTask -> StateManager : ProcessEvent(Start)\r
-StateManager -> TrackSourceCompositor : Start()\r
-TrackSourceCompositor -> DashTrackSource : Start()\r
-StateManager --> ChangeSourceTask : ret\r
-ChangeSourceTask --> Plusplayer : ret\r
-Plusplayer --> TvplusPlusplayerHelper : OnChangeSourceDone(ret)\r
-else if codec is not same\r
-TvplusPlusplayerHelper -> Plusplayer : Stop and Destroy\r
-TvplusPlusplayerHelper -> Plusplayer : PlusPlayer::Create()\r
-TvplusPlusplayerHelper -> Plusplayer : Open(url)\r
-TvplusPlusplayerHelper -> Plusplayer : PrepareAsync(url)\r
-...\r
-Plusplayer --> TvplusPlusplayerHelper : OnPrepareDone(ret)\r
-TvplusPlusplayerHelper -> Plusplayer : Start()\r
-end\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title TrackRendererAdapter Sequence Diagram\r
-participant DefaultPlayer\r
-\r
-create TrackRendererAdapter\r
-DefaultPlayer -> TrackRendererAdapter : TrackRendererAdapter::Create()\r
-TrackRendererAdapter -> TrackRendererCapi : trackrenderer_create()\r
-create TrackRenderer\r
-TrackRendererCapi -> TrackRenderer : std::unique_ptr<T>(new TrackRenderer)\r
-TrackRendererCapi --> TrackRendererAdapter : handle\r
-\r
-@enduml\r
+++ /dev/null
-@startuml\r
-\r
-title tracksource_alternative_flow_1\r
-\r
-actor App\r
-boundary BmsService\r
-\r
-App -> BmsService : request playback\r
-BmsService -> Plusplayer : Open(url)\r
-Plusplayer -> TrackSource : TrackSource::CreateCompositor()\r
-Plusplayer -> TrackSourceCompositor : RegisterEventListener(this)\r
-BmsService -> Plusplayer : RegisterEventListener()\r
-BmsService -> Plusplayer : SetSourceType(sourcetype)\r
-BmsService -> Plusplayer : PrepareAsync()\r
-Plusplayer -> TrackSourceCompositor : AddSource(sourcetype)\r
-activate TrackSourceCompositor\r
-TrackSourceCompositor -> HttpTrackSource : new\r
-HttpTrackSource --> TrackSourceCompositor : object\r
-Plusplayer -> TrackSourceCompositor : Prepare()\r
-TrackSourceCompositor -> HttpTrackSource : Prepare()\r
-group CreatePipeline\r
-HttpTrackSource -> gstreamer : pipeline_new()\r
-HttpTrackSource -> gstreamer : factory_make(src)\r
-HttpTrackSource -> gstreamer : factory_make(http_demuxer)\r
-HttpTrackSource -> gstreamer : factory_make(...)\r
-HttpTrackSource -> gstreamer : set_state(PAUSE)\r
-gstreamer --> HttpTrackSource : state_changed\r
-end\r
-HttpTrackSource --> TrackSourceCompositor : success\r
-TrackSourceCompositor --> Plusplayer : success\r
-deactivate TrackSourceCompositor\r
-Plusplayer --> BmsService : Listener::PrepareDone(success)\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title tracksource_base_flow_1\r
-\r
-actor App\r
-boundary BmsService\r
-\r
-App -> BmsService : request playback\r
-BmsService -> Plusplayer : Open(url)\r
-Plusplayer -> TrackSource : TrackSource::CreateCompositor()\r
-Plusplayer -> TrackSourceCompositor : RegisterEventListener(this)\r
-BmsService -> Plusplayer : RegisterEventListener()\r
-\r
-BmsService -> Plusplayer : PrepareAsync()\r
-Plusplayer -> TrackSourceCompositor : AddSource(url)\r
-activate TrackSourceCompositor\r
-TrackSourceCompositor -> Typefinder : probe()\r
-group createpipeline\r
-Typefinder -> gstreamer : pipeline_new()\r
-Typefinder -> gstreamer : factory_make(src)\r
-Typefinder -> gstreamer : factory_make(typefinder)\r
-gstreamer --> Typefinder : OnHaveType_(sourcetype)\r
-end\r
-Typefinder --> TrackSourceCompositor : sourcetype\r
-TrackSourceCompositor -> HttpTrackSource : new\r
-\r
-HttpTrackSource --> TrackSourceCompositor : object\r
-\r
-Plusplayer -> TrackSourceCompositor : Prepare()\r
-TrackSourceCompositor -> HttpTrackSource : Prepare()\r
-group CreatePipeline\r
-HttpTrackSource -> gstreamer : factory_make(http_demuxer)\r
-HttpTrackSource -> gstreamer : factory_make(...)\r
-HttpTrackSource -> gstreamer : set_state(PAUSE)\r
-gstreamer --> HttpTrackSource : state_changed\r
-end\r
-HttpTrackSource --> TrackSourceCompositor : success\r
-TrackSourceCompositor --> Plusplayer : success\r
-deactivate TrackSourceCompositor\r
-Plusplayer --> BmsService : Listener::PrepareDone(success)\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title tracksource_exception_flow_1\r
-\r
-actor App\r
-boundary BmsService\r
-\r
-App -> BmsService : request playback\r
-BmsService -> Plusplayer : Open(url)\r
-Plusplayer -> TrackSource : TrackSource::CreateCompositor()\r
-Plusplayer -> TrackSourceCompositor : RegisterEventListener(this)\r
-BmsService -> Plusplayer : RegisterEventListener()\r
-\r
-BmsService -> Plusplayer : PrepareAsync()\r
-Plusplayer -> TrackSourceCompositor : AddSource(url)\r
-activate TrackSourceCompositor\r
-TrackSourceCompositor -> Typefinder : probe()\r
-group createpipeline\r
-Typefinder -> gstreamer : pipeline_new()\r
-Typefinder -> gstreamer : factory_make(src)\r
-Typefinder -> gstreamer : factory_make(typefinder)\r
-gstreamer --> Typefinder : Error()\r
-end\r
-Typefinder --> TrackSourceCompositor : fail\r
-TrackSourceCompositor --> Plusplayer : fail\r
-deactivate TrackSourceCompositor\r
-Plusplayer --> BmsService : Listener::PrepareDone(fail)\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title tracksource_exception_flow_2\r
-\r
-actor App\r
-boundary BmsService\r
-\r
-App -> BmsService : request playback\r
-BmsService -> Plusplayer : Open(url)\r
-Plusplayer -> TrackSource : TrackSource::CreateCompositor()\r
-Plusplayer -> TrackSourceCompositor : RegisterEventListener(this)\r
-BmsService -> Plusplayer : RegisterEventListener()\r
-\r
-BmsService -> Plusplayer : PrepareAsync()\r
-Plusplayer -> TrackSourceCompositor : AddSource(url)\r
-activate TrackSourceCompositor\r
-TrackSourceCompositor -> Typefinder : probe()\r
-group createpipeline\r
-Typefinder -> gstreamer : pipeline_new()\r
-Typefinder -> gstreamer : factory_make(src)\r
-Typefinder -> gstreamer : factory_make(typefinder)\r
-gstreamer --> Typefinder : Error()\r
-end\r
-Typefinder --> TrackSourceCompositor : fail\r
-TrackSourceCompositor --> Plusplayer : fail\r
-deactivate TrackSourceCompositor\r
-Plusplayer --> BmsService : Listener::PrepareDone(fail)\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title tracksource_exception_flow_3\r
-\r
-actor App\r
-boundary BmsService\r
-\r
-App -> BmsService : request playback\r
-BmsService -> Plusplayer : Open(url)\r
-Plusplayer -> TrackSource : TrackSource::CreateCompositor()\r
-Plusplayer -> TrackSourceCompositor : RegisterEventListener(this)\r
-BmsService -> Plusplayer : RegisterEventListener()\r
-\r
-BmsService -> Plusplayer : PrepareAsync()\r
-Plusplayer -> TrackSourceCompositor : AddSource(url)\r
-activate TrackSourceCompositor\r
-TrackSourceCompositor -> Typefinder : probe()\r
-group createpipeline\r
-Typefinder -> gstreamer : pipeline_new()\r
-Typefinder -> gstreamer : factory_make(src)\r
-Typefinder -> gstreamer : factory_make(typefinder)\r
-gstreamer --> Typefinder : OnHaveType_(sourcetype)\r
-end\r
-Typefinder --> TrackSourceCompositor : sourcetype\r
-TrackSourceCompositor -> HttpTrackSource : new\r
-\r
-HttpTrackSource --> TrackSourceCompositor : object\r
-\r
-Plusplayer -> TrackSourceCompositor : Prepare()\r
-TrackSourceCompositor -> HttpTrackSource : Prepare()\r
-group CreatePipeline\r
-HttpTrackSource -> gstreamer : factory_make(http_demuxer)\r
-HttpTrackSource -> gstreamer : factory_make(...)\r
-HttpTrackSource -> gstreamer : set_state(PAUSE)\r
-gstreamer --> HttpTrackSource : SyncMessageHandler(Error)\r
-end\r
-HttpTrackSource --> TrackSourceCompositor : fail\r
-TrackSourceCompositor --> Plusplayer : fail\r
-deactivate TrackSourceCompositor\r
-Plusplayer --> BmsService : Listener::OnPrepareDone(fail)\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-database VersionInfo\r
-participant BmsService\r
-participant APIWrapper\r
-database Plusplayer.so\r
-\r
-ref over VersionInfo : VersionInfo contains libVersion and apiVersion\r
-ref over BmsService , VersionInfo : Compiled in SDK\r
-ref over BmsService , APIWrapper : downloaded and installed\r
-BmsService -> APIWrapper : Init()\r
-APIWrapper -> Plusplayer.so : GetVersion()\r
-Plusplayer.so --> APIWrapper : VersionInfo\r
-ref over APIWrapper : update current-apiVersion\r
-...\r
-BmsService -> APIWrapper : NewFunction()\r
-APIWrapper -> APIWrapper : check apiVersion\r
-alt current-apiVersion supports NewFuntion\r
-ref over Plusplayer.so : do something\r
-else current-apiVersion not support NewFuntion\r
-APIWrapper --> BmsService : return false\r
-end\r
-' 수정사항의 일부만 이전 모델에 반영 하는 경우....\r
-\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-title TVPlus Player update process\r
-\r
-(*) --> "Developing/Fixing Issues"\r
---> "Make TC"\r
---> "Devoloper Functional Verification"\r
-if "is there no issues ?" then\r
---> [fail] "Developing/Fixing Issues"\r
-else\r
---> [pass] "API Review w/ API reviewer board"\r
---> "Binary Compatibility Test"\r
-if "is there no issues ?" then\r
---> [fail] "Developing/Fixing Issues"\r
-else\r
---> [pass] "Library distribution to Bms Team"\r
---> "bms-daemon tpk packaing w/ player libraries"\r
---> Installation & Verification\r
-if "is there no issues ?" then\r
---> [fail] "Developing/Fixing Issues"\r
-else\r
---> [pass] "Minor/Patch Version Update"\r
---> "Request Release to Release Team"\r
---> "App server registration"\r
---> [Ending Process] (*)\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-BmsAVPlayer -> TvplusPlusplayerHelper : m_CreatePlayer()\r
-TvplusPlusplayerHelper -> Plusplayer : PlusPlayer::Create()\r
-Plusplayer --> TvplusPlusplayerHelper : object*\r
-BmsAVPlayer -> TvplusPlusplayerHelper : m_OpenStream()\r
-TvplusPlusplayerHelper -> Plusplayer : Open(url)\r
-TvplusPlusplayerHelper -> Plusplayer : SetBufferConfig()\r
-TvplusPlusplayerHelper -> Plusplayer : SetDisplayMode()\r
-TvplusPlusplayerHelper -> Plusplayer : SetDisplayRoi()\r
-TvplusPlusplayerHelper -> Plusplayer : SetDisplay(Evas_Object*)\r
-TvplusPlusplayerHelper -> Plusplayer : SetStreamingProperty()\r
-BmsAVPlayer -> TvplusPlusplayerHelper : m_Play()\r
-TvplusPlusplayerHelper -> Plusplayer : PrepareAsync()\r
-Plusplayer -> TvplusPlusplayerHelper : OnPrepareDone(ret)\r
-TvplusPlusplayerHelper -> Plusplayer : Start()\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-'skinparam backgroundColor LightYellow\r
-\r
-title plusplayer_internal_state_diagram\r
-\r
-state None {\r
-}\r
-state Idle {\r
-}\r
-state IdleInactive {\r
-}\r
-state TypeFinderReady {\r
-}\r
-state TrackSourceReady {\r
-}\r
-state Ready {\r
-}\r
-state ResourceConflicted {\r
-}\r
-\r
-\r
-[*] --> None\r
-None --> Idle : open\r
-None --> None : close\r
-\r
-Idle --> None : close\r
-Idle --> TypeFinderReady : probe\r
-Idle --> TypeFinderReady : pause_or_start_defered\r
-Idle --> IdleInactive : stop\r
-\r
-TypeFinderReady --> TrackSourceReady : prepare_source\r
-TypeFinderReady --> TrackSourceReady : pause_or_start_defered\r
-TypeFinderReady --> IdleInactive : stop\r
-\r
-TrackSourceReady --> Ready : prepare_renderer\r
-TrackSourceReady --> Ready : pause_or_start_defered\r
-TrackSourceReady --> IdleInactive : stop\r
-\r
-Ready --> Playing : start\r
-Ready --> Paused : pause\r
-Ready --> ResourceConflicted : resource_conflict\r
-Ready --> IdleInactive : stop\r
-Ready --> SourceStopped : stop_source\r
-\r
-Playing --> Paused : pause\r
-Playing --> Playing : resume\r
-Playing --> Paused : internal_pause\r
-Playing --> ResourceConflicted : resource_conflict\r
-Playing --> IdleInactive : stop\r
-Playing --> SourceStopped : stop_source\r
-\r
-Paused --> Playing : resume\r
-Paused --> Paused: pause\r
-Paused --> Playing : internal_resume\r
-Paused --> ResourceConflicted : resource_conflict\r
-Paused --> IdleInactive : stop\r
-Paused --> SourceStopped : stop_source\r
-\r
-ResourceConflicted --> Ready : restore\r
-ResourceConflicted --> IdleInactive : stop\r
-\r
-SourceChanged --> Playing : start\r
-SourceChanged --> SourceStopped : stop_source\r
-SourceChanged --> IdleInactive : stop\r
-SourceInitialized --> SourceChanged : prepare_source\r
-SourceInitialized --> SourceStopped : stop_source\r
-SourceInitialized --> IdleInactive : stop\r
-\r
-SourceStopped --> SourceInitialized : initialize_source\r
-SourceStopped --> IdleInactive : stop\r
-\r
-IdleInactive --> None : close\r
-\r
-@enduml
\ No newline at end of file
+++ /dev/null
-@startuml\r
-\r
-'skinparam backgroundColor LightYellow\r
-\r
-title plusplayer_internal_state_diagram\r
-\r
-state Statemanager {\r
-\r
-note "Active state" as N1\r
-\r
-state Idle {\r
- [*] --> IdleZero\r
- state TypeFinderReady {\r
- }\r
- state TrackSourceReady {\r
- }\r
- Idle: defer InternalPause\r
- Idle: defer InternalResume\r
-\r
- IdleZero --> PseudoExit3 : close\r
- IdleZero --> TypeFinderReady : probe\r
- TypeFinderReady --> TrackSourceReady : prepare_source\r
- TrackSourceReady --> PseudoExit : prepare_renderer\r
-\r
- IdleZero : defer SelectTrack()\r
- IdleZero : defer Pause()\r
- IdleZero : defer Start()\r
- TypeFinderReady : defer SelectTrack()\r
- TypeFinderReady : defer Pause()\r
- TypeFinderReady : defer Start()\r
- TrackSourceReady : defer Pause()\r
- TrackSourceReady : defer Start()\r
- TrackSourceReady --> TrackSourceReady : SelectTrack()\r
-}\r
-\r
-state ChangingSource {\r
- state SourceStopped {\r
- }\r
- state SourceInitialized {\r
- }\r
- ChangingSource: defer InternalPause\r
- ChangingSource: defer InternalResume\r
-\r
- [*] --> SourceStopped\r
-\r
- SourceStopped --> SourceInitialized : initialize_source\r
- SourceStopped --> SourceStopped : stop_source\r
-\r
- SourceInitialized --> SourceStopped : stop_source\r
- SourceInitialized --> PseudoExit1 : prepare_source\r
-}\r
-\r
-[*] --> None\r
-None --> Idle : open\r
-None --> None : close\r
-PseudoExit3 --> None : close\r
-PseudoExit --> Ready : prepare_renderer\r
-\r
-Ready --> Playing : start\r
-Ready --> Paused : pause\r
-Ready --> Ready : internal_pause\r
-Ready --> Playing : internal_resume\r
-Paused --> Playing : resume\r
-Paused --> Playing : internal_resume\r
-Paused --> Paused : internal_pause\r
-Paused --> Playing : start\r
-Playing --> Paused : pause\r
-Playing --> Paused : internal_pause\r
-\r
-Paused --> Paused: pause\r
-Playing --> Playing : resume\r
-\r
-ResourceConflicted --> Ready : restore\r
-Ready --> ResourceConflicted : resource_conflict\r
-Playing --> ResourceConflicted : resource_conflict\r
-Paused --> ResourceConflicted : resource_conflict\r
-\r
-Ready --> ChangingSource : stop_source\r
-Paused --> ChangingSource : stop_source\r
-Playing --> ChangingSource : stop_source\r
-\r
-PseudoExit1 --> Ready : prepare_source\r
-\r
-Playing --> Playing : seek\r
-Paused --> Paused : seek\r
-\r
-Ready --> Ready : select_track()\r
-Playing --> Playing : select_track()\r
-Paused --> Paused : select_track()\r
-\r
---\r
-\r
-note "Inactive state" as N2\r
-[*] --> Active\r
-Active --> Inactive : stop\r
-Inactive --> Inactive : stop\r
-note right of Inactive\r
-Inactive is interrupt state only allowing {stop , close} events.\r
-others will be ignored.\r
-end note\r
-Inactive --> Close : close\r
-\r
-}\r
-\r
-@enduml
\ No newline at end of file
#include "esplusplayer_capi/error.h"
#include "esplusplayer_capi/espacket.h"
#include "esplusplayer_capi/event.h"
-#include "esplusplayer_capi/latency.h"
#include "esplusplayer_capi/state.h"
#include "esplusplayer_capi/stream.h"
#include "esplusplayer_capi/submitdatatype.h"
typedef void (*esplusplayer_flush_done_cb)(void*);
typedef void (*esplusplayer_event_cb)(const esplusplayer_event_type,
const esplusplayer_event_msg, void*);
-typedef void (*esplusplayer_video_latency_status_cb)(
- const esplusplayer_latency_status latency_status, void*);
-typedef void (*esplusplayer_audio_latency_status_cb)(
- const esplusplayer_latency_status latency_status, void*);
-typedef void (*esplusplayer_video_high_latency_cb)(void*);
-typedef void (*esplusplayer_audio_high_latency_cb)(void*);
typedef void* esplusplayer_handle;
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_create()
- * @endcode
+ * @endcode
* @pre The player state must be #ESPLUSPLAYER_STATE_NONE
* @post player handle will be removed.
* @exception None
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
refer to the sample code of esplusplayer_activate()
- * @endcode
+ * @endcode
* @pre The player state must be at least #ESPLUSPLAYER_STATE_READY
* @post The player state is same as before calling
* esplusplayer_deactivate(). The deactivated stream will stop
int esplusplayer_set_display(esplusplayer_handle handle,
esplusplayer_display_type type, void* window);
/**
- * @brief Set the video display.
- * @param [in] handle : esplusplayer handle.
- * @param [in] type : display type.
- * @param [in] subsurface : the ecore wayland subsurface handle.
- * @param [in] x : the x coordinate of subsurface.
- * @param [in] y : the y coordinate of subsurface.
- * @param [in] width : the width of subsurface.
- * @param [in] height : the height of subsurface.
- * @return @c one of esplusplayer_error_type values will be returned.
- * @pre The player state must be #ESPLUSPLAYER_STATE_IDLE.
- * @post None
- * @exception None
- * @version 3.1
- * @see esplusplayer_set_display_mode() \n
- * esplusplayer_set_display_roi() \n
- * esplusplayer_set_display_visible()
- */
-int esplusplayer_set_display_ecore_subsurface(esplusplayer_handle handle,
- esplusplayer_display_type type,
- void* subsurface, int x, int y,
- int width, int height);
-/**
* @brief Set the video display mode.
* @param [in] handle : esplusplayer handle.
* @param [in] mode : display mode.
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* esplusplayer_open(esplayer);
- * esplusplayer_set_display(esplayer,ESPLUSPLAYER_DISPLAY_TYPE_OVERLAY,window);
+ * esplusplayer_set_display(esplayer,ESPLUSPLAYER_DISPLAY_TYPE_OVERLAY,window);
* esplusplayer_set_display_mode(esplayer,ESPLUSPLAYER_DISPLAY_MODE_DST_ROI);
* esplusplayer_set_display_roi(esplayer,0,0,600,500);
* // ... your codes ...
double scale_y, double scale_w, double scale_h);
/**
- * @brief Resize the render rectangle(the max region that video can be
- * displayed).
- * @param [in] handle : esplusplayer handle.
- * @param [in] x: x coordinate of render rectangle.
- * @param [in] y: y coordinate of render rectangle.
- * @param [in] width: width of render rectangle.
- * @param [in] height: height of render rectangle.
- * @return @c one of esplusplayer_error_type values will be returned.
- * @pre Should be called after esplusplayer_set_display() \n
- * esplusplayer_set_surface_display() \n
- * esplusplayer_set_ecore_display() \n
- * esplusplayer_set_display_ecore_subsurface
- * @post None
- * @exception None
- * @version 3.2
- * @remark The minimum value of width and height are 1.
- * @see esplusplayer_set_display() \n
- * esplusplayer_set_surface_display() \n
- * esplusplayer_set_ecore_display() \n
- * esplusplayer_set_display_ecore_subsurface
- */
-int esplusplayer_resize_render_rect(esplusplayer_handle handle, int x, int y,
- int width, int height);
-
-/**
* @brief Set the visibility of the video display.
* @param [in] handle : esplusplayer handle.
* @param [in] visible : the visibility of the display.
esplusplayer_handle handle, esplusplayer_display_rotation_type* rotation);
/**
- * @deprecated Deprecated since API V2.0. Use
- * esplusplayer_set_submit_data_type() instead.
- * @brief Set whether to send decrypted es packets in the trust zone.
- * @param [in] handle : esplusplayer handle.
- * @param [in] using_tz : whether to use trust zone memory.
- * (@c true = if decrypted packets are sent in trust zone, @c false =
- * otherwise @c)
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * esplusplayer_set_tz_use(esplayer, true);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE.
- * @post None
- * @exception None
- * @remark This API have to be called before calling
- * esplusplayer_prepare_async(). \n If using_tz is set to true, use
- * esplusplayer_submit_trust_zone_packet() to send decrypted packets.
- * @see esplusplayer_open() \n
- * esplusplayer_submit_trust_zone_packet()
- */
-int esplusplayer_set_tz_use(esplusplayer_handle handle, bool using_tz);
-
-/**
* @brief Set whether to send decrypted es packets in the trust zone or
* encrypted es packets.
* @param [in] handle : esplusplayer handle.
* esplusplayer_prepare_async(). \n
* If type is ESPLUSPLAYER_SUBMIT_DATA_TYPE_CLEAN_DATA use
* esplusplayer_submit_packet() to send clean packets. \n
- * If type is ESPLUSPLAYER_SUBMIT_DATA_TYPE_TRUSTZONE_DATA, use
- * esplusplayer_submit_trust_zone_packet() to send decrypted packets
- * in trust zone \n
* If type is ESPLUSPLAYER_SUBMIT_DATA_TYPE_ENCRYPTED_DATA, use
* esplusplayer_submit_encrypted_packet() to send encrypted packets.
* @see esplusplayer_open() \n
- * esplusplayer_submit_trust_zone_packet() \n
* esplusplayer_submit_encrypted_packet() \n
* esplusplayer_submit_data_type
*/
* esplusplayer_handle esplayer = esplusplayer_create();
* // ... your codes ...
* esplusplayer_state ret = esplusplayer_get_state(esplayer);
- * // ... your codes ...
+ * // ... your codes ...
* esplusplayer_destroy(esplayer);
* @endcode
* @pre None
esplusplayer_handle handle, esplusplayer_es_packet* packet);
/**
- * @brief Submit es packet to decode audio or video.
- * @param [in] handle : esplusplayer handle.
- * @param [in] packet : es packet pointer.
- * @param [in] tz_handle : es decrypted tz handle.
- * @return @c ESPLUSPLAYER_SUBMIT_STATUS_SUCCESS : succeed to submit es
- * packet,
- * otherwise @c : fail to submit es packet.
- * @code
- * refer to the sample code of esplusplayer_submit_packet();
- * @endcode
- * @pre User can submit es packets after
- * esplusplayer_ready_to_prepare_cb() or
- * esplusplayer_ready_to_seek_cb() is called.
- * @post None
- * @exception None
- * @remark Amount of packets for at least one decoded frame must be submitted
- * after calling esplusplayer_prepare_async() or esplusplayer_seek()
- * for invoking esplusplayer_prepare_async_done_cb() or
- * esplusplayer_seek_done_cb(). \n
- * To use this api, Must set
- * ESPLUSPLAYER_SUBMIT_DATA_TYPE_TRUSTZONE_DATA using
- * esplusplayer_set_submit_data_type() \n This api must be called from a
- * different thread than other apis.
- * @see esplusplayer_es_packet \n
- * esplusplayer_buffer_status_cb() \n
- * esplusplayer_ready_to_prepare_cb() \n
- * esplusplayer_ready_to_seek_cb()
- */
-esplusplayer_submit_status esplusplayer_submit_trust_zone_packet(
- esplusplayer_handle handle, esplusplayer_es_packet* packet,
- uint32_t tz_handle);
-
-/**
* @brief Submit encrypted es packet to decode and decrypt audio or video.
* @param [in] handle : esplusplayer handle.
* @param [in] packet : es packet pointer.
* otherwise @c : fail to submit es packet.
* @code
* refer to the sample code of esplusplayer_submit_packet();
- * @endcode
+ * @endcode
* @pre User can submit es packets after
* esplusplayer_ready_to_prepare_cb() or
* esplusplayer_ready_to_seek_cb() is called.
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
- * prepare esplayer done
+ * prepare esplayer done
* // ... your codes ...
* uint64_t count = 0;
* esplusplayer_get_adaptive_info(esplayer,
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
- * esplusplayer_open(esplayer);
+ * esplusplayer_open(esplayer);
* int vol = 80;
* esplusplayer_set_volume(esplayer, vol)
* // ... your codes ...
* esplusplayer_set_video_frame_buffer_type(esplayer,
* ESPLUSPLAYER_DECODED_VIDEO_FRAME_BUFFER_TYPE_NONE);
* // ... your codes ...
- * esplusplayer_close(esplayer);
+ * esplusplayer_close(esplayer);
* @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE when type
is not equal to be
esplusplayer_decoded_video_frame_buffer_type type);
/**
- * @brief Set the request frame rate of decoded video
- * @param [in] handle : esplusplayer handle.
- * @param [in] request_framerate : the request frame rate of returned decoded video frame
- * The value of track_framerate(A) and request_framerate(B) should be one of the following sets:
- * track_framerate indicate the frame rate of input video stream
- * 1.A/(A-B) = X ,X means drop 1 frame every X frame
- * 2.Special cases,such as 24000/1000 -> 15000/1000
- * when request_framerate.num = 0, return none decoded video frame
- * when request_framerate.num/request_framerate.den =
- * track_framerate.num/track_framerate.den, return all decoded
- * video frame
- * when request_framerate.num/request_framerate.den <
- * track_framerate.num/track_framerate.den, drop some decoded
- * video frame
- * @return @c one of esplusplayer_error_type values will be returned.
- * @pre The player state must be not #ESPLUSPLAYER_STATE_NONE.
- * @post None
- * @exception None
- * @version 3.3
- * @remark only works when decoded video frame buffer type is scale
- * esplusplayer_set_video_frame_buffer_type()
- * esplusplayer_set_media_packet_video_decoded_cb()
- */
-int esplusplayer_set_decoded_video_frame_rate(
- esplusplayer_handle handle, esplusplayer_rational request_framerate);
-
-/**
- * @brief Set the target scale resolution when decoded video frame buffer
- * type is scale
- * @param [in] handle : esplusplayer handle.
- * @param [in] target_width : scale target width of video frame buffer.
- * @param [in] target_width : scale target height of video frame buffer.
- * @return @c one of esplusplayer_error_type values will be returned.
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE.
- * @post None
- * @exception None
- * @version 3.1
- * @remark esplusplayer_set_video_frame_buffer_type()
- * esplusplayer_set_media_packet_video_decoded_cb()
- * If user don't call this api to set target_width and target_height,
- * the default
- * target scale resolution is 960x540
- */
-int esplusplayer_set_video_frame_buffer_scale_resolution(
- esplusplayer_handle handle, uint32_t target_width, uint32_t target_height);
-
-/**
* @brief Flush buffers for a player.
* @param [in] handle : esplusplayer handle ptr.
* @param [in] type : choose which stream data need to be
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_buffer_status_cb() will be invoked.
* @exception None
* @remark esplusplayer_buffer_status_cb()
- * if buffer_status_cb is set to null,
+ * if buffer_status_cb is set to null,
* esplusplayer_buffer_status_cb() will not be invoked anymore.
*/
int esplusplayer_set_buffer_status_cb(
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_submit_packet();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_buffer_byte_status_cb() will be invoked.
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
refer to the sample code of esplusplayer_submit_packet();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_buffer_time_status_cb() will be invoked.
* @remark esplusplayer_buffer_time_status_cb(),
* esplusplayer_buffer_time_status_cb() will be invoked only
* when the duration value of espacket is set.
- * if buffer_status_cb is set to null,
+ * if buffer_status_cb is set to null,
* esplusplayer_buffer_time_status_cb() will not be invoked anymore.
*/
int esplusplayer_set_buffer_time_status_cb(
esplusplayer_buffer_time_status_cb buffer_status_cb, void* userdata);
/**
- * @brief Set a callback function to be invoked when video latency status
- * is changed.
- * @param [in] handle : esplusplayer handle.
- * @param [in] video_high_latency_status_cb : the video high latency status
- * callback function to register.
- * @param [in] userdata : userdata of
- * esplusplayer_set_video_latency_status_cb()
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
- * or #ESPLUSPLAYER_STATE_IDLE.
- * @post esplusplayer_video_latency_status_cb() will be invoked.
- * @exception None
- * @version 3.0
- * @remark esplusplayer_video_latency_status_cb() will be invoked only
- * when mid / high latency threshold is set.
- */
-int esplusplayer_set_video_latency_status_cb(
- esplusplayer_handle handle,
- esplusplayer_video_latency_status_cb video_high_latency_status_cb,
- void* userdata);
-
-/**
- * @brief Set a callback function to be invoked when audio latency status
- * is changed.
- * @param [in] handle : esplusplayer handle.
- * @param [in] audio_high_latency_status_cb : the audio high latency status
- * callback function to register.
- * @param [in] userdata : userdata of
- * esplusplayer_set_audio_latency_status_cb()
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
- * or #ESPLUSPLAYER_STATE_IDLE.
- * @post esplusplayer_audio_latency_status_cb() will be invoked.
- * @exception None
- * @version 3.0
- * @remark esplusplayer_audio_latency_status_cb() will be invoked only
- * when mid / high latency threshold is set.
- */
-int esplusplayer_set_audio_latency_status_cb(
- esplusplayer_handle handle,
- esplusplayer_audio_latency_status_cb audio_high_latency_status_cb,
- void* userdata);
-
-/**
* @brief Set buffer size with different option
* @param [in] handle : esplusplayer handle.
* @param [in] option : the option of buffer size.
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_resource_conflicted_cb() will be invoked.
* @exception None
* @remark esplusplayer_resource_conflicted_cb()
- * if resource_conflicted_cb is set to null,
+ * if resource_conflicted_cb is set to null,
* esplusplayer_resource_conflicted_cb() will not be invoked
* anymore.
*/
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_eos_cb() will be invoked.
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_submit_packet();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post None
* @exception None
* @remark esplusplayer_prepare_async()
- * if ready_to_prepare_cb is set to null,
+ * if ready_to_prepare_cb is set to null,
* esplusplayer_ready_to_prepare_cb() will not be invoked anymore.
*/
int esplusplayer_set_ready_to_prepare_cb(
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of plusplayer_prepare_async();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_prepare_async_done_cb() will be invoked.
* @exception It is prohibited to call any player APIs at
* esplusplayer_prepare_async_done_cb callback.
* @remark esplusplayer_prepare_async_done_cb()
- * if prepare_async_done_cb is set to null,
+ * if prepare_async_done_cb is set to null,
* esplusplayer_prepare_async_done_cb() will not be
* invoked anymore.
* @see plusplayer_prepare_async
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_seek_done_cb() will be invoked.
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post None
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post None
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post When there is closed caption data, call
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre This api should be called before esplusplayer_flush() is called
* @post esplusplayer_flush_done_cb() will be invoked.
* @exception None
* @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
* @code
* refer to the sample code of esplusplayer_set_error_cb();
- * @endcode
+ * @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE
* or #ESPLUSPLAYER_STATE_IDLE.
* @post esplusplayer_event_cb() will be invoked.
* esplusplayer_open(esplayer);
* esplusplayer_set_low_latency_mode(esplayer,ESPLUSPLAYER_LOW_LATENCY_MODE_NONE);
* // ... your codes ...
- * esplusplayer_close(esplayer);
+ * esplusplayer_close(esplayer);
* @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE.
* @post None
* @remark esplusplayer_set_unlimited_max_buffer_mode().
* esplusplayer_buffer_status_cb() will be invoked in
* overrun/underrun buffer status. but
- * esplusplayer_submit_packet()/esplusplayer_submit_trust_zone_packet()
- * /esplusplayer_submit_encrypted_packet()
+ * esplusplayer_submit_packet() /
+ * esplusplayer_submit_encrypted_packet()
* does not return ESPLUSPLAYER_SUBMIT_STATUS_FULL
* @see esplusplayer_open() \n
* esplusplayer_submit_packet() \n
- * esplusplayer_submit_trust_zone_packet() \n
* esplusplayer_submit_encrypted_packet()
*/
int esplusplayer_set_unlimited_max_buffer_mode(esplusplayer_handle handle);
* esplusplayer_open(esplayer);
* esplusplayer_set_fmm_mode(esplayer);
* // ... your codes ...
- * esplusplayer_close(esplayer);
+ * esplusplayer_close(esplayer);
* @endcode
* @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE.
* @post None
*/
int esplusplayer_set_video_codec_type(esplusplayer_handle handle,
esplusplayer_video_codec_type type);
-/**
- * @brief Provided api for setting alternative video resource(sub decoder
- * and sub scaler)
- * @param [in] handle : esplusplayer handle ptr.
- * @param [in] rsc_type : set alternative video resource
- * (@c 0 [defualt] = set all video resources(decoder/scaler) to main
- * resources,
- * @c 1 = set all video resources(decoder/scaler) to sub resources,
- * @c 2 = set only decoder to sub resource,
- * @c 3 = set only scaler to sub resource)
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * esplusplayer_set_alternative_video_resource(esplayer,1);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state can be all of #State except
- * #ESPLUSPLAYER_STATE_NONE.
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-int esplusplayer_set_alternative_video_resource(esplusplayer_handle handle,
- unsigned int rsc_type);
-
-/**
- * @brief Provided api for switching audio stream between the different
- * audio codec types on the fly
- * @param [in] handle : esplusplayer handle ptr.
- * @param [in] stream : audio stream pointer
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * prepare esplayer done
- * // ... your codes ...
- * esplusplayer_audio_stream_info audio_stream;
- * audio_stream.mime_type = ESPLUSPLAYER_AUDIO_MIME_TYPE_AC3;
- * audio_stream.sample_rate = 48000;
- * audio_stream.channels = 2;
- * esplusplayer_switch_audio_stream_onthefly(esplayer,
- * &audio_stream);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_READY,
- * #ESPLUSPLAYER_STATE_PAUSED or #ESPLUSPLAYER_STATE_PLAYING
- * @post None
- * @exception None
- * @remark Audio codec can be switched between only
- * #ESPLUSPLAYER_AUDIO_MIME_TYPE_AAC,
- * #ESPLUSPLAYER_AUDIO_MIME_TYPE_EAC3
- * and #ESPLUSPLAYER_AUDIO_MIME_TYPE_AC3.
- * if other codec is set, this api will return false.
- * @version 3.0
- * @see esplusplayer_prepare_async()
- */
-int esplusplayer_switch_audio_stream_onthefly(
- esplusplayer_handle handle, esplusplayer_audio_stream_info* stream);
-/**
- * @brief Provided api for setting aifilter
- * @param [in] handle : esplusplayer handle ptr.
- * @param [in] aifilter : aifilter plugin.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * GstElement* aifilter_ =
- * gst_element_factory_make("aifilter_autozoom","auto_zoom");
- * g_object_set(G_OBJECT(aifilter_), "az_cb_out_fps", 30, NULL);
- * g_object_set(G_OBJECT(aifilter_), "az_inference_fps", 2, NULL);
- * g_object_set(G_OBJECT(aifilter_), "az_disp_width", 1920, NULL);
- * g_object_set(G_OBJECT(aifilter_), "az_disp_height", 1080, NULL);
- * g_object_set(G_OBJECT(aifilter_), "az_detection_type", 2, NULL);
- * g_object_set(G_OBJECT(aifilter_), "az_scaler_type", 1, NULL);
- * g_object_set(G_OBJECT(aifilter_), "az_target_num", 2, NULL);
- * esplusplayer_set_aifilter(esplayer,aifilter_);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE.
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-int esplusplayer_set_aifilter(esplusplayer_handle handle, void* aifilter);
-
-/**
- * @brief Provided api for setting render time offset
- * @param [in] handle : esplusplayer handle ptr.
- * @param [in] type : stream type
- * @param [in] offset : offset (milisecond).
- * G_MININT64 <= offset * 1000000 <= G_MAXINT64
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * esplusplayer_set_low_latency_mode(esplayer,ESPLUSPLAYER_LOW_LATENCY_MODE_NONE);
- * prepare esplayer
- * // ... your codes ...
- * int64_t set_offset = 10;
- * esplusplayer_set_render_time_offset(esplayer,ESPLUSPLAYER_STREAM_TYPE_VIDEO,
- * set_offset);
- * int64_t get_offset = 0;
- * esplusplayer_get_render_time_offset(esplayer_,ESPLUSPLAYER_STREAM_TYPE_VIDEO,
- * &get_offset);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_READY,
- * #ESPLUSPLAYER_STATE_PAUSED or #ESPLUSPLAYER_STATE_PLAYING.
- * It have to be set to low latency mode. (all mode except
- * # ESPLUSPLAYER_LOW_LATENCY_MODE_DISABLE_SYNC)
- * @remark esplusplayer_set_low_latency_mode().
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-int esplusplayer_set_render_time_offset(esplusplayer_handle handle,
- esplusplayer_stream_type type,
- int64_t offset);
-/**
- * @brief Provided api for getting render time offset
- * @param [in] handle : esplusplayer handle ptr.
- * @param [in] type : stream type
- * @param [in] offset : offset ptr (milisecond).
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_READY,
- * #ESPLUSPLAYER_STATE_PAUSED or #ESPLUSPLAYER_STATE_PLAYING.
- * It have to be set to low latency mode.
- * @remark esplusplayer_set_low_latency_mode().
- * @post None
- * @exception None
- * @version 3.0
- * see esplusplayer_set_render_time_offset
- */
-int esplusplayer_get_render_time_offset(esplusplayer_handle handle,
- esplusplayer_stream_type type,
- int64_t* offset);
-/**
- * @brief Provided api for setting catch up speed level in low latency mode
- * @param [in] handle : esplusplayer handle.
- * @param [in] level : speed level to catch up
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * esplusplayer_set_low_latency_mode(esplayer,ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO);
- * esplusplayer_set_catch_up_speed(esplayer,ESPLUSPLAYER_CATCH_UP_SPEED_MID);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_IDLE,
- * #ESPLUSPLAYER_STATE_READY, #ESPLUSPLAYER_STATE_PLAYING
- * or #ESPLUSPLAYER_STATE_PAUSED
- * esplusplayer_set_low_latency_mode() should be called as below
- * before this api is called.
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_AUDIO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_DISABLE_SYNC),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_DISABLE_VIDEO_QUALITY)
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-int esplusplayer_set_catch_up_speed(esplusplayer_handle handle,
- esplusplayer_catch_up_speed level);
-
-/**
- * @brief Provided api for getting current video latency status
- * @param [in] handle : esplusplayer handle.
- * @param [out] status : current latency status
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * prepare esplayer done
- * // ... your codes ...
- * esplusplayer_latency_status current_status =
- * ESPLUSPLAYER_LATENCY_LOW;
- * esplusplayer_get_video_latency_status(esplayer, ¤t_status);
- * // ... your codes ...
- * esplusplayer_stop(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_READY,
- * #ESPLUSPLAYER_STATE_PLAYING or #ESPLUSPLAYER_STATE_PAUSED
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_prepare_async()
- */
-int esplusplayer_get_video_latency_status(esplusplayer_handle handle,
- esplusplayer_latency_status* status);
-
-/**
- * @brief Provided api for getting current audio latency status
- * @param [in] handle : esplusplayer handle.
- * @param [out] status : current latency status
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * prepare esplayer done
- * // ... your codes ...
- * esplusplayer_latency_status current_status =
- * ESPLUSPLAYER_LATENCY_LOW;
- * esplusplayer_get_audio_latency_status(esplayer, ¤t_status);
- * // ... your codes ...
- * esplusplayer_stop(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_READY,
- * #ESPLUSPLAYER_STATE_PLAYING or #ESPLUSPLAYER_STATE_PAUSED
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_prepare_async()
- */
-int esplusplayer_get_audio_latency_status(esplusplayer_handle handle,
- esplusplayer_latency_status* status);
-
-/**
- * @brief Provided api for setting video mid latency threshold for low
- * latency
- * playback
- * @param [in] handle : esplusplayer handle.
- * @param [in] threshold: the threshold(number) of the video frames for mid
- * latency.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * esplusplayer_set_low_latency_mode(esplayer,ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO);
- * esplusplayer_set_video_mid_latency_threshold(esplayer,2);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_IDLE,
- * #ESPLUSPLAYER_STATE_READY, #ESPLUSPLAYER_STATE_PLAYING
- * or #ESPLUSPLAYER_STATE_PAUSED
- * esplusplayer_set_low_latency_mode() should be called as below
- * before this api is called.
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_AUDIO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_DISABLE_SYNC),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_ENABLE_GAME_MODE)
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-/// TODO:: set the min/max value of the threshold
-int esplusplayer_set_video_mid_latency_threshold(esplusplayer_handle handle,
- const unsigned int threshold);
-
-/**
- * @brief Provided api for setting audio mid latency threshold for low
- * latency
- * playback
- * @param [in] handle : esplusplayer handle.
- * @param [in] threshold: the threshold(number) of the audio frames for mid
- * latency.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * esplusplayer_set_low_latency_mode(esplayer,ESPLUSPLAYER_LOW_LATENCY_MODE_AUDIO);
- * esplusplayer_set_audio_mid_latency_threshold(esplayer,2);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_IDLE,
- * #ESPLUSPLAYER_STATE_READY, #ESPLUSPLAYER_STATE_PLAYING
- * or #ESPLUSPLAYER_STATE_PAUSED
- * esplusplayer_set_low_latency_mode() should be called as below
- * before this api is called.
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_AUDIO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_DISABLE_SYNC),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_ENABLE_GAME_MODE)
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-/// TODO:: set the min/max value of the threshold
-int esplusplayer_set_audio_mid_latency_threshold(esplusplayer_handle handle,
- const unsigned int threshold);
-
-/**
- * @brief Provided api for setting video high latency threshold for low
- * latency
- * playback
- * @param [in] handle : esplusplayer handle.
- * @param [in] threshold: the threshold(number) of the video frames for high
- * latency.
- * @param [in] video_high_latency_cb : high latency callback function to
- * register
- * @param [in] userdata : userdata of esplusplayer_high_latency_cb()
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * static void OnVideoHighLatency(void* userdata) {
- * printf ("OnVideoHighLatency\n");
- * }
- * esplusplayer_open(esplayer);
- * esplusplayer_set_low_latency_mode(esplayer,ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO);
- * esplusplayer_set_video_high_latency_threshold(esplayer, 2,
- * OnVideoHighLatency, nullptr);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_IDLE,
- * #ESPLUSPLAYER_STATE_READY, #ESPLUSPLAYER_STATE_PLAYING
- * or #ESPLUSPLAYER_STATE_PAUSED
- * esplusplayer_set_low_latency_mode() should be called as below
- * before this api is called.
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_AUDIO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_DISABLE_SYNC),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_ENABLE_GAME_MODE)
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-/// TODO:: set the min/max value of the threshold
-int esplusplayer_set_video_high_latency_threshold(
- esplusplayer_handle handle, const unsigned int threshold,
- esplusplayer_video_high_latency_cb video_high_latency_cb, void* userdata);
-
-/**
- * @brief Provided api for setting audio high latency threshold for low
- * latency
- * playback
- * @param [in] handle : esplusplayer handle.
- * @param [in] threshold: the threshold(number) of the audio frames for high
- * latency.
- * @param [in] audio_high_latency_cb : high latency callback function to
- * register
- * @param [in] userdata : userdata of esplusplayer_high_latency_cb()
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * static void OnAudioHighLatency(void* userdata) {
- * printf ("OnAudioHighLatency\n");
- * }
- * esplusplayer_open(esplayer);
- * esplusplayer_set_low_latency_mode(esplayer,ESPLUSPLAYER_LOW_LATENCY_MODE_AUDIO);
- * esplusplayer_set_audio_high_latency_threshold(esplayer, 2,
- * OnAudioHighLatency, nullptr);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state must be one of #ESPLUSPLAYER_STATE_IDLE,
- * #ESPLUSPLAYER_STATE_READY, #ESPLUSPLAYER_STATE_PLAYING
- * or #ESPLUSPLAYER_STATE_PAUSED
- * esplusplayer_set_low_latency_mode() should be called as below
- * before this api is called.
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_AUDIO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_VIDEO),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_DISABLE_SYNC),
- * esplusplayer_set_low_latency_mode(handle,
- * ESPLUSPLAYER_LOW_LATENCY_MODE_ENABLE_GAME_MODE)
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-/// TODO:: set the min/max value of the threshold
-int esplusplayer_set_audio_high_latency_threshold(
- esplusplayer_handle handle, const unsigned int threshold,
- esplusplayer_audio_high_latency_cb audio_high_latency_cb, void* userdata);
-
-/**
- * @brief Initialize easing info to esplayer.
- * @param [in] handle : esplusplayer handle.
- * @param [in] init_volume : initial easing volume (0 ~ 100).
- * @param [in] elapsed_time : initial elapsed time (millisecond).
- * @param [in] easing_info : target volume, duration, type.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * uint32_t volume = 50, elapsed_time = 10000;
- * esplusplayer_target_audio_easing_info easing_info;
- * easing_info.volume = 30;
- * easing_info.duration = 100;
- * easing_info.type = ESPLUSPLAYER_AUDIO_EASING_INCUBIC;
- * esplusplayer_init_audio_easing_info(esplayer,volume,elapsed_time,&easing_info);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state can be all of #esplusplayer_state except
- * #ESPLUSPLAYER_STATE_NONE.
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-int esplusplayer_init_audio_easing_info(
- esplusplayer_handle handle, uint32_t init_volume, uint32_t elapsed_time,
- const esplusplayer_target_audio_easing_info* easing_info);
-
-/**
- * @brief Update easing info to esplayer to update target info.
- * @param [in] handle : esplusplayer handle.
- * @param [in] easing_info : target volume, duration, type.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * // ... your codes ...
- * esplusplayer_target_audio_easing_info easing_info;
- * easing_info.volume = 30;
- * easing_info.duration = 100;
- * easing_info.type = ESPLUSPLAYER_AUDIO_EASING_INCUBIC;
- * esplusplayer_update_audio_easing_info(esplayer,&easing_info);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state can be all of #esplusplayer_state except
- * #ESPLUSPLAYER_STATE_NONE.
- * This api should be called after
- * esplusplayer_init_audio_easing_info() is called
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
- */
-int esplusplayer_update_audio_easing_info(
- esplusplayer_handle handle,
- const esplusplayer_target_audio_easing_info* easing_info);
-
-/**
- * @brief Get easing info currently in easing operation from esplayer
- * @param [in] handle : esplusplayer handle.
- * @param [out] current_volume : current volume (0 ~ 100).
- * @param [out] elapsed_time : elapsed time (millisecond).
- * @param [out] easing_info : target volume, duration, type.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * // ... your codes ...
- * uint32_t cur_volume = 50, elapsed_time = 0;
- * esplusplayer_target_audio_easing_info easing_info;
- * esplusplayer_get_audio_easing_info(esplayer,&cur_volume,&elapsed_time,&easing_info);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state can be all of #esplusplayer_state except
- * #ESPLUSPLAYER_STATE_NONE.
- * This api should be called after
- * esplusplayer_init_audio_easing_info() is called
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open()
-
- */
-int esplusplayer_get_audio_easing_info(
- esplusplayer_handle handle, uint32_t* current_volume,
- uint32_t* elapsed_time, esplusplayer_target_audio_easing_info* easing_info);
-
-/**
- * @brief Start audio easing using a registered audio easing info
- * @param [in] handle : esplusplayer handle.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * prepare esplayer done
- * uint32_t volume = 50, elapsed_time = 10000;
- * esplusplayer_target_audio_easing_info easing_info;
- * easing_info.volume = 30;
- * easing_info.duration = 100;
- * easing_info.type = ESPLUSPLAYER_AUDIO_EASING_INCUBIC;
- * esplusplayer_init_audio_easing_info(esplayer,volume,elapsed_time,&easing_info);
- * esplusplayer_start_audio_easing(esplayer);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state should be at least #ESPLUSPLAYER_STATE_READY.
- * This api should be called after
- * esplusplayer_init_audio_easing_info() is called
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open() \n
- * esplusplayer_init_audio_easing_info() \n
- * esplusplayer_update_audio_easing_info() \n
- * esplusplayer_stop_audio_easing() \n
- * esplusplayer_prepare_async()
- */
-int esplusplayer_start_audio_easing(esplusplayer_handle handle);
-
-/**
- * @brief Stop audio easing
- * @param [in] handle : esplusplayer handle.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * esplusplayer_open(esplayer);
- * // ... your codes ...
- * esplusplayer_stop_audio_easing(esplayer);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * @endcode
- * @pre The player state can be all of #esplusplayer_state except
- * #ESPLUSPLAYER_STATE_NONE.
- * This api should be called after
- * esplusplayer_init_audio_easing_info() is called
- * @post None
- * @exception None
- * @version 3.0
- * @see esplusplayer_open() \n
- * esplusplayer_start_audio_easing()
- */
-int esplusplayer_stop_audio_easing(esplusplayer_handle handle);
-
-/**
- * @brief Get virtual resource id
- * @param [in] handle : esplusplayer handle.
- * @param [in] type : The resource type of virtual id.
- * @param [out] virtual_id : Stored virtual resource id value.
- * @return @c ESPLUSPLAYER_ERROR_TYPE_NONE on success,otherwise @c one of esplusplayer_error_type
- * values will be returned.
- * @retval #ESPLUSPLAYER_ERROR_TYPE_NONE Successful
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER Invalid parameter
- * @retval #ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION Internal operation failed
- * @code
- * prepare esplayer done
- * // ... your codes ...
- * int virtual_id;
- * esplusplayer_get_virtual_rsc_id(esplayer,ESPLUSPLAYER_RSC_TYPE_VIDEO_RENDERER,&virtual_id);
- * // ... your codes ...
- * esplusplayer_close(esplayer);
- * esplusplayer_destroy(esplayer);
- * @endcode
- * @pre The player state should be #State::kReady, #State::kPlaying or
- * #State::kPaused
- * @post None
- * @return @c True on success, otherwise @c False ("virtual_id" will be -1)
- * @exception None
- * @version 3.0
- * @remark This function returns virtual resource id which player is
- * allocated from resource manager. For example, virtual scaler id is
- * required for an application to use capture API directly.
- * @see esplusplayer_prepare_async()
-
- */
-int esplusplayer_get_virtual_rsc_id(esplusplayer_handle handle,
- const esplusplayer_rsc_type type,
- int* virtual_id);
-
-/**
- * @brief Set advanced picture quality type.
- * @param [in] handle : esplusplayer handle.
- * @param [in] type : The picture quality type.
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE.
- * @post None
- * @return @c one of esplusplayer_error_type values will be returned.
- * @exception None
- * @version 3.1
- */
-int esplusplayer_set_advanced_picture_quality_type(
- esplusplayer_handle handle,
- esplusplayer_advanced_picture_quality_type type);
-
-/**
- * @brief Set resource allocate policy.
- * @param [in] handle : esplusplayer handle.
- * @param [in] policy : The resource allocate policy.
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_IDLE.
- * @post None
- * @return @c one of esplusplayer_error_type values will be returned.
- * @exception None
- * @version 3.2
- */
-int esplusplayer_set_resource_allocate_policy(
- esplusplayer_handle handle, esplusplayer_rsc_alloc_policy policy);
#ifdef __cplusplus
}
#include <stdint.h>
-typedef void (*esplusplayer_decoder_underrun_cb)(void* userdata);
typedef void* esplusplayer_handle;
typedef void (*esplusplayer_first_video_decoding_done_cb)(void*);
esplusplayer_first_video_decoding_done_cb first_video_decoding_done_cb,
void* userdata);
-/**
- * @brief Set a callback function to be invoked when buffer underrun is
- * occurred from a video decoder.
- * @param [in] handle : esplusplayer handle.
- * @param [in] callback : the callback function to register.
- * @param [in] userdata : userdata of esplusplayer_decoder_underrun_cb()
- * @return @c one of esplusplayer_error_type values will be returned.
- * @pre The player state must be set to #ESPLUSPLAYER_STATE_NONE or
- * #ESPLUSPLAYER_STATE_IDLE.
- * @post esplusplayer_decoder_underrun_cb() will be invoked.
- * @exception None
- * @remark esplusplayer_decoder_underrun_cb().
- * if video_decoder_underrun_cb is set to null,
- * esplusplayer_decoder_underrun_cb() will not be invoked anymore.
- */
-int esplusplayer_set_video_decoder_underrun_cb(
- esplusplayer_handle handle,
- esplusplayer_decoder_underrun_cb video_decoder_underrun_cb, void* userdata);
-
-/**
- * @brief Get the size of struct esplusplayer_app_info
- * @param None
- * @return Total size of struct esplusplayer_app_info
- * @pre None
- * @post None
- * @exception None
- */
-int get_size_of_esplusplayer_app_info(void);
-
-/**
- * @brief Get the size of struct esplusplayer_es_packet
- * @param None
- * @return Total size of struct esplusplayer_es_packet
- * @pre None
- * @post None
- * @exception None
- */
-int get_size_of_esplusplayer_es_packet(void);
-
-/**
- * @brief Get the size of struct esplusplayer_es_tz_packet
- * @param None
- * @return Total size of struct esplusplayer_es_tz_packet
- * @pre None
- * @post None
- * @exception None
- */
-int get_size_of_esplusplayer_es_tz_packet(void);
-
-/**
- * @brief Get the size of struct esplusplayer_audio_stream_info
- * @param None
- * @return Total size of struct esplusplayer_audio_stream_info
- * @pre None
- * @post None
- * @exception None
- */
-int get_size_of_esplusplayer_audio_stream_info(void);
-
-/**
- * @brief Get the size of struct esplusplayer_video_stream_info
- * @param None
- * @return Total size of struct esplusplayer_video_stream_info
- * @pre None
- * @post None
- * @exception None
- */
-int get_size_of_esplusplayer_video_stream_info(void);
-
-/**
- * @brief Get the size of struct esplusplayer_drm_info
- * @param None
- * @return Total size of struct esplusplayer_drm_info
- * @pre None
- * @post None
- * @exception None
- */
-int get_size_of_esplusplayer_drm_info(void);
-
#ifdef __cplusplus
}
#endif
+++ /dev/null
-/**
- * @file
- * @brief Latency enum.
- * @interfacetype Platform
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 3.0
- * @SDK_Support N
- * @remark This is a group of C style state related enum.
- * @see State enum convertion.
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_ESPLUSPLAYER_CAPI_LATENCY_H__
-#define __PLUSPLAYER_ESPLUSPLAYER_CAPI_LATENCY_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/**
- * @brief Enumerations for esplusplayer catch up speed
- */
-enum esplusplayer_catch_up_speed {
- ESPLUSPLAYER_CATCH_UP_SPEED_NONE, /**< do not use catch up mode */
- ESPLUSPLAYER_CATCH_UP_SPEED_SLOW, /**< catch up speed is slow */
- ESPLUSPLAYER_CATCH_UP_SPEED_MID, /**< catch up speed is normal */
- ESPLUSPLAYER_CATCH_UP_SPEED_FAST /**< catch up speed is fast */
-};
-
-/**
- * @brief Enumerations for esplusplayer latency status
- */
-enum esplusplayer_latency_status {
- ESPLUSPLAYER_LATENCY_LOW, /**< latency status is low */
- ESPLUSPLAYER_LATENCY_MID, /**< latency status is middle */
- ESPLUSPLAYER_LATENCY_HIGH /**< latency status is high */
-};
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // __PLUSPLAYER_ESPLUSPLAYER_CAPI_LATENCY_H__
enum esplusplayer_submit_data_type {
ESPLUSPLAYER_SUBMIT_DATA_TYPE_CLEAN_DATA,
ESPLUSPLAYER_SUBMIT_DATA_TYPE_ENCRYPTED_DATA,
- ESPLUSPLAYER_SUBMIT_DATA_TYPE_TRUSTZONE_DATA,
+// ESPLUSPLAYER_SUBMIT_DATA_TYPE_TRUSTZONE_DATA,
};
#ifdef __cplusplus
+++ /dev/null
-/**
- * @file decodedvideoinfo.h
- * @brief Information for decoded video frames
- * @interfacetype Module
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 0.0.1
- * @SDK_Support N
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_MIXER_DECODED_VIDEO_INFO_H__
-#define __PLUSPLAYER_MIXER_DECODED_VIDEO_INFO_H__
-
-#include <tbm_type_common.h>
-
-#include <cstdint>
-
-namespace plusplayer {
-
-struct DecodedRawPlaneInfo {
- std::uint32_t phyaddr;
- std::uint32_t viraddr;
- std::uint32_t linesize;
-};
-
-struct DecodedRawInfo {
- std::uint32_t width;
- std::uint32_t height;
- DecodedRawPlaneInfo y_info;
- DecodedRawPlaneInfo uv_info;
-};
-
-struct DecodedVideoKeyTypeInfo {
- std::uint32_t width;
- std::uint32_t height;
- tbm_key key;
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_DECODED_VIDEO_INFO_H__
+++ /dev/null
-/**
- * @file mixer.h
- * @brief Mixes raw video frame and rendering mixed frame
- * @interfacetype Module
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 0.0.1
- * @SDK_Support N
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_MIXER_MIXER__H__
-#define __PLUSPLAYER_MIXER_MIXER__H__
-
-#include <boost/core/noncopyable.hpp>
-#include <memory>
-
-#include "mixer/mixer_eventlistener.h"
-#include "mixer/mixerticket.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-/**
- * @brief Enumerations for Resource allocation policy
- */
-enum class RscAllocMode {
- kDefault, /**< Main -> Sub -> S/W */
- kNdecoder, /**< Only N decoder */
- kDisable /**< Mixer is NOT involved in resource allocation */
-};
-/**
- * @brief Class Mixer
- */
-/**
- * @brief Provides methods to control mixer pipeline and modify
- * mixed frame.
- * @remark It internally manages MixerTicket objects which are
- * combined with player objects.
- * @see Mixerticket
- */
-class Mixer : private boost::noncopyable {
- public:
- using Ptr = std::unique_ptr<Mixer>;
- /**
- * @brief Create a mixer object
- * @remarks You must use this to get mixer object
- * @pre None
- * @post None
- * @exception None
- * @return mixer object (unique_ptr<Mixer>)
- */
- static Ptr Create();
- /**
- * @brief Struct for Resolution info of mixed frame.
- * @brief Default info is 1920x1080, 30fps
- */
- struct ResolutionInfo {
- int width = 1920; /**< Width of mixed frame */
- int height = 1080; /**< Height of mixed frame */
- int framerate_num = 30; /**< Framerate numerator of mixed frame */
- int framerate_den = 1; /**< Framerate denominator of mixed frame */
- };
-
- public:
- /**
- * @brief Destructor of Mixer
- * @pre None
- * @post None
- * @exception None
- * @return None
- * @see Mixer::Create()
- */
- virtual ~Mixer(){};
- /**
- * @brief Starts Mixer
- * @pre None
- * @post Black frame or mixed frame will be displayed on the screen
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see Mixer::Stop()
- */
- virtual bool Start() { return false; }
- /**
- * @brief Stops Mixer
- * @pre Mixer::Start() was called
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see Mixer::Start()
- */
- virtual bool Stop() { return false; }
- /**
- * @brief Gets maximal number of players which can be connected to Mixer
- * @pre None
- * @post None
- * @exception None
- * @return Non-zero value on success, otherwise zero
- */
- virtual int GetMaximumAllowedNumberOfPlayer() { return 0; }
- /**
- * @brief Sets the video display
- * @remarks We are not supporting changing display.
- * @remarks This API have to be called before calling the
- * Mixer::Start() to reflect the display type.
- * @param [in] type : display type
- * @param [in] obj : The handle to display window
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see DisplayType
- * Mixer::SetDisplayRoi()
- */
- virtual bool SetDisplay(const DisplayType type, void* obj) { return false; }
- /**
- * @brief Sets the video display
- * @remarks We are not supporting changing display.
- * @remarks This API have to be called before calling the
- * Mixer::Start() to reflect the display type.
- * @param [in] type : display type
- * @param [in] serface_id : resource id of window
- * @param [in] x : x param of display window
- * @param [in] y : y param of display window
- * @param [in] w : width of display window
- * @param [in] h : height of display window
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see DisplayType
- * Mixer::SetDisplayRoi()
- */
- virtual bool SetDisplay(const DisplayType type, const uint32_t surface_id, const int x, const int y, const int w, const int h) { return false; }
- /**
- * @brief Set the video display mode
- * @param [in] mode : display mode
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see DisplayMode
- * @see Mixer::SetDisplay()
- * @see Mixer::SetDisplayRoi()
- */
- virtual bool SetDisplayMode(const DisplayMode& mode) { return false; }
- /**
- * @brief Sets the ROI(Region Of Interest) area of display
- * @remarks The minimum value of width and height are 1.
- * @param [in] geometry : Roi Geometry
- * @pre Before set display ROI, #DisplayMode::kDstRoi must be set
- * with Mixer::SetDisplayMode().
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see DisplayMode \n
- * Mixer::SetDisplay() \n
- * Mixer::SetDisplayMode()
- */
- virtual bool SetDisplayRoi(const Geometry& geometry) { return false; }
- /**
- * @brief Set Resource allocation policy.
- * @param [in] mode : Resource allocation policy
- * @pre This api should be called before setting player's display type to
- * mixer type.
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetRscAllocMode(const RscAllocMode& mode) { return false; }
- /**
- * @brief Disable audio focus setting.
- * The mixer has no authority to set audio focus and player can
- * control audio pipeline's activation/deactivation.
- * @pre This api should be called before setting player's display type to
- * mixer type.
- * @post SetAudioFocus() will return false.
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool DisableAudioFocusSetting() { return false; }
- /**
- * @brief Set the alternative video scaler.
- * The mixer change to use the sub video scaler instead of main video
- * scaler(default).
- * @pre This api should be called before setting player's display type to
- * mixer type.
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetAlternativeVideoScaler() { return false; }
- /**
- * @brief Sets audio focus on the specific player object
- * @param [in] player_instance : The handle to player instance
- * @pre None
- * @post The player which gets audio focus will activate its audio
- * pipeline.
- * By default, players deactivate audio until setting audio focus.
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetAudioFocus(const void* player_instance) { return false; }
- /**
- * @brief Applies geometry changes on mixed frame
- * @pre SetDisplayRoi() was called for players which are connected to
- * Mixer.
- * @post All the geometry changes will be applied to mixed frame.
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool Commit() { return false; }
- /**
- * @brief Sets resolution of mixed frame
- * @remarks By default, the resolution of mixed frame is 1920x1080.
- * @param [in] info : The resolution info of mixed frame
- * @pre Mixer has no connected players yet.
- * @post The resolution of mixed frame will be changed.
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetResolution(const ResolutionInfo& info) { return false; }
- /**
- * @brief Register eventlistener to Mixer
- * @param [in] listener : listener object
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see MixerEventListener
- */
- virtual bool RegisterListener(MixerEventListener* listener) { return false; }
- /**
- * @brief Creates MixerTicket object for the specific player
- * @param [in] player_instance : The handle to player instance
- * @pre None
- * @post None
- * @exception None
- * @return A valid @c MixerTicket object on success, otherwise @c nullptr
- */
- virtual MixerTicket* CreateTicket(const void* player_instance) {
- return nullptr;
- }
-
- protected:
- /**
- * @brief Constructor of Mixer
- * @pre None
- * @post None
- * @exception None
- * @return None
- * @see Mixer::Create()
- */
- Mixer() noexcept {};
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_MIXER__H__
+++ /dev/null
-/**
- * @file mixer_eventlistener.h
- * @brief Handles various events which comes from Mixer
- * @interfacetype Module
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 0.0.1
- * @SDK_Support N
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_SRC_MIXER_MIXER_EVENTLISTENER__H__
-#define __PLUSPLAYER_SRC_MIXER_MIXER_EVENTLISTENER__H__
-
-namespace plusplayer {
-/**
- * @brief Class MixerEventListener
- */
-/**
- * @brief Notifies event that an application needs to handle.
- * @remark An application should implement concrete class.
- * @see Mixer::RegisterListener
- */
-class MixerEventListener {
- public:
- /**
- * @brief Constuctor of MixerEventListener
- * @pre None
- * @post None
- * @exception None
- * @return None
- */
- MixerEventListener(){};
- /**
- * @brief Destructor of MixerEventListener
- * @pre None
- * @post None
- * @exception None
- * @return None
- */
- virtual ~MixerEventListener(){};
- /**
- * @brief It will be invoked when an error is occured in Mixer object
- * @remark OnError means that Mixer can't continue its operation.
- * An application may need to terminate Mixer usage.
- * @pre MixerEventListener object is registered
- * @post None
- * @exception None
- * @return None
- */
- virtual void OnError() {}
- /**
- * @brief It will be invoked when Mixer's own pipeline is notified
- * resource confliction
- * @remark OnResourceConflicted means that Mixer can't play anymore.
- * An application must terminate Mixer usage.
- * @pre MixerEventListener object is registered
- * @post None
- * @exception None
- * @return None
- */
- virtual void OnResourceConflicted() {}
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_SRC_MIXER_MIXER_EVENTLISTENER__H__
+++ /dev/null
-/**
- * @file mixerticket.h
- * @brief Connects player to Mixer and allows it to send raw video
- * frame
- * @interfacetype Module
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 0.0.1
- * @SDK_Support N
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_SRC_MIXER_MIXERTICKET__H__
-#define __PLUSPLAYER_SRC_MIXER_MIXERTICKET__H__
-
-#include <memory>
-
-#include "mixer/decodedvideoinfo.h"
-#include "mixer/mixerticket_eventlistener.h"
-
-namespace plusplayer {
-/**
- * @brief Enumerations for Resource category
- * @brief Each player informs mixer with this category so that
- * Mixer can understand which player uses which resources.
- */
-enum class ResourceCategory {
- kVideoDecoder, /**< Video decoder category */
- kAudioDecoder, /**< Audio decoder category */
- kScaler /**< Scaler category */
-};
-/**
- * @brief Enumerations for Resource type
- * @brief Each player informs mixer with this type so that
- * Mixer can understand which player uses main or sub type.
- */
-enum class ResourceType {
- kHwMain, /**< H/W Main resource type */
- kHwSub, /**< H/W Sub resource type */
- kSw, /**< S/W resource type. Only valid for decoder category */
- kNdecoder, /**< N decoder resource type */
- kMax /**< Size of this enumeration (not used) */
-};
-/**
- * @brief Class MixerTicket
- */
-/**
- * @brief Provides methods for player to send their raw video
- * frame to Mixer.
- * @remark It also helps player to request H/W resources without
- * causing confliction.
- * @see Mixer
- */
-class MixerTicket {
- public:
- /**
- * @brief Constuctor of MixerTicket
- * @pre None
- * @post None
- * @exception None
- * @return None
- */
- MixerTicket(){};
- /**
- * @brief Destructor of MixerTicket
- * @pre None
- * @post None
- * @exception None
- * @return None
- */
- virtual ~MixerTicket(){};
- /**
- * @brief Gets currently available resource type for the player
- * @param [in] category : The resource category that player wants to use
- * @param [out] type : The resource type that player can allocate
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool GetAvailableResourceType(const ResourceCategory& category,
- ResourceType* type) {
- return false;
- }
- /**
- * @brief Informs mixer about resource allocation status
- * @param [in] category : The resource category that player is using
- * @param [in] type : The resource type that player is using
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool Alloc(const ResourceCategory& category,
- const ResourceType& type) {
- return false;
- }
- /**
- * @brief Renders decoded video frame into mixed frame in Mixer object
- * @param [in] info : The decoded physical address by H/W deocder
- * and the resolution of video frame.
- * @pre MixerTicket::Prepare() must be performed without error
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool Render(const DecodedRawInfo& info) { return false; }
- /**
- * @brief Renders decoded video frame into mixed frame in Mixer object
- * @param [in] info : The information for tbm_key exported and the
- * resolution of video frame.
- * @pre MixerTicket::Prepare() must be performed without error
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool Render(const DecodedVideoKeyTypeInfo& info) { return false; }
- /**
- * @brief Registers eventlistener to MixerTicket
- * @param [in] listener : listener object
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- * @see MixerTicketEventListener
- */
- virtual bool RegisterListener(MixerTicketEventListener* listener) {
- return false;
- }
- /**
- * @brief Prepares MixerTicket objects to be ready for use
- * @pre None
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool Prepare() { return false; }
- /**
- * @brief Get the status whether the mixer can handle player's audio focus.
- * @pre None
- * @post None
- * @exception None
- * @return @c True : The mixer can handle player's audio focus,
- * @c False : The mixer can't handle player's audio focus and
- * the attached players will determin whether to activate
- * audio track directly.
- */
- virtual bool IsAudioFocusHandler() { return false; }
- /**
- * @brief Get the status whether Mixer can handle player's resource
- * allocation.
- * @pre None
- * @post None
- * @exception None
- * @return @c True : The mixer will allocate appropriate video decoder
- * resources to the attached players,
- * @c False : The attached player sets the video decoder resource to
- * be allocated directly instead of the mixer.
- */
- virtual bool IsRscAllocHandler() { return false; }
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_SRC_MIXER_MIXERTICKET__H__
\ No newline at end of file
+++ /dev/null
-/**
- * @file mixerticket_eventlistener.h
- * @brief Handles various events which comes from MixerTicket
- * @interfacetype Module
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 0.0.1
- * @SDK_Support N
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_SRC_MIXER_MIXERTICKET_EVENTLISTENER__H__
-#define __PLUSPLAYER_SRC_MIXER_MIXERTICKET_EVENTLISTENER__H__
-
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-/**
- * @brief Class MixerTicketEventListener
- */
-/**
- * @brief Notifies event that player needs to handle.
- * @remark Player should implement concrete class.
- * @see MixerTicket::RegisterListener
- */
-class MixerTicketEventListener {
- public:
- /**
- * @brief Constuctor of MixerTicketEventListener
- * @pre None
- * @post None
- * @exception None
- * @return None
- */
- MixerTicketEventListener(){};
- /**
- * @brief Destructor of MixerTicketEventListener
- * @pre None
- * @post None
- * @exception None
- * @return None
- */
- virtual ~MixerTicketEventListener(){};
- /**
- * @brief It will be invoked when audio focus is being changed
- * @param [in] active : @c True if the player gets focused, otherwise @c
- * False.
- * @pre MixerTicketEventListener object is registered
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool OnAudioFocusChanged(bool active) { return false; }
- /**
- * @brief It will be invoked when the mixed frame's geometry is being
- * changed
- * @param [in] cur_info : current display info that Mixer stores for this
- * player
- * @param [out] new_info : update display info that player needs to
- * provide for Mixer
- * @pre MixerTicketEventListener object is registered
- * @post None
- * @exception None
- * @return @c True on success, otherwise @c False
- */
- virtual bool OnUpdateDisplayInfo(const DisplayInfo& cur_info,
- DisplayInfo* new_info) {
- return false;
- }
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_SRC_MIXER_MIXERTICKET_EVENTLISTENER__H__
+++ /dev/null
-/**
- * @file
- * @brief Display related enums
- * @interfacetype Platform
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 3.0
- * @SDK_Support N
- * @remark This is a group of C style display releted data structures
- * and enums.
- * @see The display related enum values and data structures will be
- * converted by this managed C version types to avoid binary
- * compatibility.
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_MIXER_CAPI_DISPLAY_H__
-#define __PLUSPLAYER_MIXER_CAPI_DISPLAY_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @brief Enumerations for the display mode
- */
-enum mixer_display_mode {
- MIXER_DISPLAY_MODE_LETTER_BOX,
- MIXER_DISPLAY_MODE_ORIGIN_SIZE,
- MIXER_DISPLAY_MODE_FULL_SCREEN,
- MIXER_DISPLAY_MODE_CROPPED_FULL,
- MIXER_DISPLAY_MODE_ORIGIN_OR_LETTER,
- MIXER_DISPLAY_MODE_DST_ROI
-};
-
-/**
- * @brief Enumerations for the display type
- */
-enum mixer_display_type {
- MIXER_DISPLAY_TYPE_NONE,
- MIXER_DISPLAY_TYPE_OVERLAY,
-};
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // __PLUSPLAYER_MIXER_CAPI_DISPLAY_H__
\ No newline at end of file
+++ /dev/null
-/**
- * @file
- * @brief Error related enums
- * @interfacetype Platform
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 3.0
- * @SDK_Support N
- * @remark This is a group of C style error releted enum.
- * @see All error enum values will be converted to this managed error
- * types.
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_MIXER_CAPI_ERROR_H__
-#define __PLUSPLAYER_MIXER_CAPI_ERROR_H__
-
-#include "tizen.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define MIXER_ERROR_CLASS TIZEN_ERROR_PLAYER | 0x20
-
-/**
- * @brief Enumerations for the error type
- */
-enum mixer_error_type {
- MIXER_ERROR_TYPE_NONE = TIZEN_ERROR_NONE, /**< Successful */
- MIXER_ERROR_TYPE_INVALID_PARAMETER = TIZEN_ERROR_INVALID_PARAMETER, /**< Invalid parameter */
- MIXER_ERROR_TYPE_INVALID_OPERATION = TIZEN_ERROR_INVALID_OPERATION, /**< Invalid operation */
-};
-
-#ifdef __cplusplus
-} // extern "C"
-#endif
-
-#endif // __PLUSPLAYER_MIXER_CAPI_ERROR_H__
\ No newline at end of file
+++ /dev/null
-/**
- * @file mixer_capi.h
- * @brief Mixer api c version
- * @interfacetype Platform
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 3.0
- * @SDK_Support N
- * @remark This is mixer api header implemented as C style to
- * avoid binary compatibility issues.
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-
-#ifndef __PLUSPLAYER_MIXER_CAPI_MIXER_CAPI_H__
-#define __PLUSPLAYER_MIXER_CAPI_MIXER_CAPI_H__
-
-#include "mixer_capi/error.h"
-#include "mixer_capi/display.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stdint.h>
-
-typedef void (*mixer_resource_conflicted_cb)(void*);
-
-typedef void* mixer_handle;
-typedef void* mixer_ticket_h;
-
-/**
- * @brief Enumerations for the resource allocation mode
- */
-enum mixer_rsc_alloc_mode {
- MIXER_RSC_ALLOC_MODE_DEFAULT, /**< Main -> Sub -> S/W */
- MIXER_RSC_ALLOC_MODE_NDECODER, /**< Only N decoder */
- MIXER_RSC_ALLOC_MODE_DISABLE /**< Mixer is NOT involved in resource allocation */
-};
-
-/**
- * @brief Create a mixer handle
- * @param None
- * @return return mixer handle pointer
- * @code
- // basic api call sequence
- mixer_handle mixer = mixer_create();
- mixer_set_display(mixer, MIXER_DISPLAY_TYPE_OVERLAY, window);
-
- esplusplayer_handle player1 = esplusplayer_create();
- esplusplayer_open(player1);
-
- esplusplayer_set_display(player1, ESPLUSPLAYER_DISPLAY_TYPE_MIXER, mixer);
- eplusplayer_set_display_roi(player1, x, y, w, h);
-
- mixer_set_audio_focus(mixer, player1);
-
- esplusplayer_set_video_stream_info(player1, video_info);
- esplusplayer_set_audio_stream_info(player1, audio_info);
- esplusplayer_prepare_async(player1);
-
- mixer_start(mixer);
- esplusplayer_start(player1);
-
- mixer_stop(mixer);
- esplusplayer_close(player1);
- mixer_destroy(mixer);
- esplusplayer_destroy(player1);
- * @endcode
- * @pre None
- * @post None
- * @exception None
- */
-mixer_handle mixer_create();
-
-/**
- * @brief Release mixer handle
- * @param [in] handle : mixer handle
- * @return @c one of mixer_error_type values will be returned
- * @pre None
- * @post mixer handle will be removed
- * @exception None
- * @see mixer_create()
- */
-int mixer_destroy(mixer_handle handle);
-
-/**
- * @brief Starts Mixer.
- * @param [in] handle : mixer handle
- * @return @c one of mixer_error_type values will be returned
- * @pre None
- * @post Black frame or mixed frame will be displayed on the screen
- * @exception None
- * @see mixer_stop()
- */
-int mixer_start(mixer_handle handle);
-
-/**
- * @brief Stops Mixer
- * @param [in] handle : Mixer handle
- * @return @c one of mixer_error_type values will be returned
- * @pre mixer_start() should be called
- * @post None
- * @exception None
- * @see mixer_start()
- */
-int mixer_stop(mixer_handle handle);
-
-/**
- * @brief Gets maximal number of players which can be connected to Mixer
- * @param [in] handle : Mixer handle
- * @return Non-zero value on success, otherwise zero
- * @pre None
- * @post None
- * @exception None
- */
-int mixer_get_max_allowed_number_of_player(mixer_handle handle);
-
-/**
- * @brief Sets the video display
- * @param [in] handle : Mixer handle
- * @param [in] type : display type
- * @param [in] window : The handle to display window
- * @return @c one of mixer_error_type values will be returned
- * @pre This API have to be called before calling the
- * mixer_start() to reflect the display type
- * @post None
- * @exception None
- * @remarks We are not supporting changing display
- * @see mixer_display_type \n
- * mixer_set_display_roi()
- */
-int mixer_set_display(mixer_handle handle, mixer_display_type type,
- void* window);
-
-/**
- * @brief Set the video display mode
- * @param [in] handle : Mixer handle
- * @param [in] mode : display mode
- * @return @c one of mixer_error_type values will be returned
- * @pre None
- * @post None
- * @exception None
- * @see mixer_display_mode
- * @see mixer_set_display() \n
- * mixer_set_display_roi()
- */
-int mixer_set_display_mode(mixer_handle handle, mixer_display_mode mode);
-
-/**
- * @brief Sets the ROI(Region Of Interest) area of display
- * @param [in] handle : Mixer handle
- * @param [in] geometry : Roi Geometry
- * @return @c one of mixer_error_type values will be returned
- * @code
- // The ROI of mixer means display area in tv screen.
- // The ROI of each player means display area in mixer's ROI.
-
- mixer_set_display_mode(mixer, MIXER_DISPLAY_MODE_DST_ROI);
- mixer_set_display_roi(mixer, 0, 0, 1920, 1080);
-
- esplusplayer_set_display_roi(player1, 20, 20, 700, 400);
- esplusplayer_set_display_roi(player2, 20, 20, 700, 400);
-
- mixer_commit(mixer);
- * @endcode
- * @pre Before set display ROI, #MIXER_DISPLAY_MODE_DST_ROI must be set
- * with mixer_set_display_mode()
- * @post None
- * @exception None
- * @remarks The minimum value of width and height are 1.
- * @see mixer_display_mode \n
- * mixer_set_display() \n
- * mixer_set_display_mode()
- */
-int mixer_set_display_roi(mixer_handle handle, const int x, const int y,
- const int width, const int height);
-
- /**
- * @brief Applies geometry changes on mixed frame
- * @param [in] handle : Mixer handle
- * @return @c one of mixer_error_type values will be returned
- * @pre set display roi api was called for players which are connected to
- * Mixer.
- * @post All the geometry changes will be applied to mixed frame.
- * @exception None
- * @see mixer_set_display_roi()
- */
- int mixer_commit(mixer_handle handle);
-
- /**
- * @brief Set Resource allocation policy
- * @param [in] handle : Mixer handle
- * @param [in] mode : Resource allocation policy
- * @return @c one of mixer_error_type values will be returned
- * @pre This api should be called before setting player's display type to
- * mixer type.
- * @post None
- * @exception None
- */
- int mixer_set_rsc_alloc_mode(mixer_handle handle,
- const mixer_rsc_alloc_mode mode);
-
-/**
- * @brief Disable audio focus setting.
- * The mixer has no authority to set audio focus and player can
- * control audio pipeline's activation/deactivation.
- * @param [in] handle : Mixer handle
- * @return @c one of mixer_error_type values will be returned
- * @pre This api should be called before setting player's display type to
- * mixer type.
- * @post mixer_set_audio_focus() will return error.
- * @exception None
- */
-int mixer_disable_audio_focus_setting(mixer_handle handle);
-
-/**
- * @brief Set the alternative video scaler.
- * The mixer change to use the sub video scaler instead of main video
- * scaler(default).
- * @param [in] handle : Mixer handle
- * @return @c one of mixer_error_type values will be returned
- * @pre This api should be called before mixer_start().
- * @post None
- * @exception None
- */
-int mixer_set_alternative_video_scaler(mixer_handle handle);
-
-/**
- * @brief Sets audio focus on the specific player object
- * @param [in] handle : Mixer handle
- * @param [in] player_instance : The handle to player instance
- * @return @c one of mixer_error_type values will be returned
- * @pre None
- * @post The player which gets audio focus will activate its audio
- * pipeline. By default, players deactivate audio until setting
- * audio focus.
- * @exception None
- */
-int mixer_set_audio_focus(mixer_handle handle, const void* player_instance);
-
-/**
- * @brief Sets resolution of mixed frame
- * @param [in] handle : Mixer handle
- * @param [in] info : The resolution info of mixed frame
- * @return @c one of mixer_error_type values will be returned
- * @pre Mixer has no connected players yet.
- * @post The resolution of mixed frame will be changed.
- * @exception None
- * @remarks By default, the resolution of mixed frame is 1920x1080.
- */
-int mixer_set_resolution(mixer_handle handle, const int width, const int height,
- const int framerate_num, const int framerate_den);
-
-/**
- * @brief Creates MixerTicket object for the specific player
- * @param [in] handle : Mixer handle
- * @param [in] player_instance : The handle to player instance
- * @return A valid @c MixerTicket object on success, otherwise @c nullptr
- * @pre None
- * @post None
- * @exception None
- */
-mixer_ticket_h mixer_create_ticket(mixer_handle handle,
- const void* player_instance);
-
-// callback function
-
-/**
- * @brief It will be invoked when Mixer's own pipeline is notified
- * resource confliction
- * @param [in] handle : Mixer handle
- * @param [in] callback : the callback function to register
- * @param [in] userdata : userdata of resource_conflicted_cb()
- * @return @c one of mixer_error_type values will be returned
- * @pre None
- * @post resource_conflicted_cb will be invoked when resources are
- * conflicted
- * @exception None
- * @remark resource_conflicted_cb means that Mixer can't play anymore.
- * An application must terminate Mixer usage.
- */
-int mixer_set_resource_conflicted_cb(
- mixer_handle handle, mixer_resource_conflicted_cb resource_conflicted_cb,
- void* userdata);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __PLUSPLAYER_MIXER_CAPI_MIXER_CAPI_H__
-
kAudioQueueCurrentLevelByte, // std::uint64_t
kVideoMinByteThreshold, // std::uint32_t
kAudioMinByteThreshold, // std::uint32_t
+ kVideoQueueMaxBuffer, // std::uint64_t
+ kAudioQueueMaxBuffer, // std::uint64_t
+#if 0
kVideoQueueMaxTime, // std::uint64_t
kAudioQueueMaxTime, // std::uint64_t
kVideoQueueCurrentLevelTime, // std::uint64_t
kAudioQueueCurrentLevelTime, // std::uint64_t
kVideoMinTimeThreshold, // std::uint32_t
kAudioMinTimeThreshold, // std::uint32_t
+#endif
kMax,
};
+++ /dev/null
-/**\r
- * @file audioeasinginfo.h\r
- * @interfacetype module\r
- * @privlevel None-privilege\r
- * @privilege None\r
- * @product TV, AV, B2B\r
- * @version 3.0\r
- * @SDK_Support N\r
- *\r
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved\r
- * PROPRIETARY/CONFIDENTIAL\r
- * This software is the confidential and proprietary\r
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall\r
- * not disclose such Confidential Information and shall use it only in\r
- * accordance with the terms of the license agreement you entered into with\r
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the\r
- * suitability of the software, either express or implied, including but not\r
- * limited to the implied warranties of merchantability, fitness for a\r
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any\r
- * damages suffered by licensee as a result of using, modifying or distributing\r
- * this software or its derivatives.\r
- */\r
-#ifndef __PLUSPLAYER_AUDIOEASINGINFO_H__\r
-#define __PLUSPLAYER_AUDIOEASINGINFO_H__\r
-\r
-namespace plusplayer {\r
-\r
-enum class AudioEasingType {\r
- kAudioEasingLinear = 0,\r
- kAudioEasingIncubic,\r
- kAudioEasingOutcubic,\r
- kAudioEasingNone\r
-};\r
-\r
-/**\r
- * @brief audio easing information struct\r
- */\r
-struct AudioEasingInfo {\r
- uint32_t target_volume; /**< Audio easing target volume (0 ~ 100)*/\r
- uint32_t duration; /**< Audio easing duration, in millisecond */\r
- AudioEasingType type; /**< Audio easing type */\r
-};\r
-} // namespace plusplayer\r
-\r
-#endif // __PLUSPLAYER_AUDIOEASINGINFO_H__
\ No newline at end of file
+++ /dev/null
-/**
- * @file
- * @brief the decoded video packet for playback
- * @interfacetype Module
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 0.0.1
- * @SDK_Support N
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-#ifndef __PLUSPLAYER_DECODED_VIDEO_PACKET_EX_H__
-#define __PLUSPLAYER_DECODED_VIDEO_PACKET_EX_H__
-
-#include <boost/core/noncopyable.hpp>
-#include <memory>
-#include <utility>
-
-#include "tbm_surface.h"
-#include "tbm_type.h"
-
-namespace plusplayer {
-
-class DecodedVideoPacketEx : private boost::noncopyable {
- public:
- using Ptr = std::unique_ptr<DecodedVideoPacketEx>;
-
- static Ptr Create(const uint64_t pts = 0, const uint64_t duration = 0,
- tbm_surface_h surface_data = nullptr,
- const void* scaler_index = nullptr);
-
- DecodedVideoPacketEx() = delete;
-
- virtual ~DecodedVideoPacketEx();
-
- uint64_t GetPts() const { return pts_; }
- uint64_t GetDuration() const { return duration_; }
- const tbm_surface_h GetTbmSurface() const { return surface_data_; }
- const void* GetScalerIndex() const { return scaler_index_; }
-
- protected:
- explicit DecodedVideoPacketEx(const uint64_t pts, const uint64_t duration,
- tbm_surface_h surface_data,
- const void* scaler_index)
- : pts_(pts),
- duration_(duration),
- surface_data_(surface_data),
- scaler_index_(scaler_index) {}
-
- private:
- const uint64_t pts_ = 0;
- const uint64_t duration_ = 0;
- tbm_surface_h surface_data_ = nullptr; // tbm_surface
- const void* scaler_index_ = nullptr;
-};
-
-using DecodedVideoPacketExPtr = DecodedVideoPacketEx::Ptr;
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_DECODED_VIDEO_PACKET_EX_H__
/**
-* @file
+* @file
* @interfacetype module
* @privlevel None-privilege
* @privilege None
* @SDK_Support N
*
* Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-* PROPRIETARY/CONFIDENTIAL
+* PROPRIETARY/CONFIDENTIAL
* This software is the confidential and proprietary
* information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
* not disclose such Confidential Information and shall use it only in
kSecuremedia,
kSdrm,
kWidevineCdm = 8,
+ kClearkey,
kMax
};
LicenseAcquiredCb license_acquired_cb = nullptr; // The cb will be invoked when license was acquired.
UserData license_acquired_userdata = nullptr; // The userdata will be sent by license_acquired_cb
};
-
+
} // namespace drm
} // namespace plusplayer
#include "plusplayer/types/buffer.h"
#include "plusplayer/types/error.h"
#include "plusplayer/types/event.h"
-#include "plusplayer/types/latency.h"
#include "plusplayer/types/stream.h"
namespace plusplayer {
*/
virtual void OnError(const ErrorType& error_code, UserData userdata) {}
/**
- * @brief It will be invoked when error has happened
- * @param [in] error_code : #ErrorType
- * @param [in] error_msg : detailed error message including info related to
- * codec,demuxer,network status, etc.
- * @see #ErrorType
- * @see OnError() if only simple error code is required
- */
- virtual void OnErrorMsg(const ErrorType& error_code, const char* error_msg,
- UserData userdata) {}
- /**
* @brief It will be invoked when buffer overrun or underrun is detected
* @param [in] type : the type of target stream
* @param [in] status : current buffer status
UserData userdata) {}
/**
- * @brief Set a callback function to be invoked when trackrender side need
- * to get an useful tbm surface.
- * @param [in] ptr : pointer which set to get tbm address.
- * @param [in] is_scale_change : parameter which indicate whether the
- * scale resolution changed.
- * @remark SetVideoFrameBufferType()
- */
- virtual void OnMediaPacketGetTbmBufPtr(void** ptr, bool is_scale_change) {}
-
- /**
* @brief Set a callback function to be invoked when player decoded video
* frame. A video frame can be retrieved
* @param [in] packet : decoded video packet
UserData userdata) {}
virtual void OnFirstDecodingDone(UserData userdata) {}
-
- /**
- * @brief It will be invoked when buffer underrun is detected from a video
- * decoder.
- * @param [in] userdata : the user data passed from the event listener
- * registration function
- */
- virtual void OnVideoDecoderUnderrun(UserData userdata) {}
-
- /**
- * @brief It will be invoked when the latency status of the video stream
- * changes.
- * @param [in] latency_status : the latency status
- * [in] userdata : the user data passed from the event listener
- * registration function
- */
- virtual void OnVideoLatencyStatus(const LatencyStatus& latency_status,
- UserData userdata) {}
-
- /**
- * @brief It will be invoked when the latency status of the audio stream
- * changes.
- * @param [in] latency_status : the latency status
- * [in] userdata : the user data passed from the event listener
- * registration function
- */
- virtual void OnAudioLatencyStatus(const LatencyStatus& latency_status,
- UserData userdata) {}
- /**
- * @brief It will be invoked when video high latency occurs.
- * @param [in] userdata : the user data passed from the event listener
- * registration function
- */
- virtual void OnVideoHighLatency(UserData userdata) {}
-
- /**
- * @brief It will be invoked when audio high latency occurs.
- * @param [in] userdata : the user data passed from the event listener
- * registration function
- */
- virtual void OnAudioHighLatency(UserData userdata) {}
};
} // namespace plusplayer
#include <utility>
#include <vector>
-#ifndef IS_AUDIO_PRODUCT
-#include "mixer/mixer.h"
-#endif
-
#include "plusplayer/appinfo.h"
-#include "plusplayer/audioeasinginfo.h"
#include "plusplayer/drm.h"
#include "plusplayer/elementary_stream.h"
#include "plusplayer/es_eventlistener.h"
#include "plusplayer/types/buffer.h"
#include "plusplayer/types/display.h"
#include "plusplayer/types/error.h"
-#include "plusplayer/types/latency.h"
-#include "plusplayer/types/picturequality.h"
-#include "plusplayer/types/resource.h"
#include "plusplayer/types/submitdata.h"
namespace plusplayer {
* @description to support video fast decoding/rendering and video
* with seamless resolution change.
*/
- kLowLatencyModeVideoWithSeamlessResolutionChange = 0x0040,
+ kLowLatencyModeVideoWithSeamlessResolutionChange = 0x0040,
/**
* @description to disable clock sync and a/v sync when rendering. it
* includes #kLowLatencyModeDisablePreroll.
* EsPlusPlayer::SetDisplayVisible()
*/
virtual bool SetDisplay(const DisplayType& type, void* obj) { return false; }
-#ifndef IS_AUDIO_PRODUCT
- /**
- * @brief Set the video display
- * @remarks We are not supporting changing display.
- * @remarks This API have to be called before calling the
- * PlusPlayer::Prepare()
- * or PlusPlayer::PrepareAsync() to reflect the display type.
- * @param [in] type : display type
- * @param [in] handle : The handle of mixer ticket
- * @pre The player state must be set to #EsState::kIdle
- * @post None
- * @return @c True on success, otherwise @c False
- * @see DisplayType
- * PlusPlayer::SetDisplayRoi()
- * PlusPlayer::SetDisplayVisible()
- * @exception None
- */
- virtual bool SetDisplay(const DisplayType& type, MixerTicket* handle) {
- return false;
- }
-#endif
/**
* @brief Set the video display
* @remarks We are not supporting changing display.
* @remarks This API have to be called before calling the
* EsPlusPlayer::PrepareAsync() to reflect the display type.
* @param [in] type : display type
- * @param [in] ecore_wl2_subsurface : The ecore wayland subsurface handle
- * @param [in] x : x param of display window
- * @param [in] y : y param of display window
- * @param [in] w : width of display window
- * @param [in] h : height of display window
- * @pre The player state must be set to #EsState::kIdle
- * @return @c True on success, otherwise @c False
- * @see DisplayType \n
- * EsPlusPlayer::SetDisplayMode() \n
- * EsPlusPlayer::SetDisplayRoi() \n
- * EsPlusPlayer::SetDisplayVisible()
- */
- virtual bool SetDisplaySubsurface(const DisplayType& type,
- void* ecore_wl2_subsurface, const int x,
- const int y, const int w, const int h) {
- return false;
- }
- /**
- * @brief Set the video display
- * @remarks We are not supporting changing display.
- * @remarks This API have to be called before calling the
- * EsPlusPlayer::PrepareAsync() to reflect the display type.
- * @param [in] type : display type
* @param [in] surface_id : resource id of window.
* @param [in] x : x param of display window
* @param [in] y : y param of display window
virtual bool SetVideoRoi(const CropArea& area) { return false; }
/**
- * @brief Resize the render rectangle(the max region that video can be
- * displayed).
- * @param [in] rect : render rectangle.
- * @pre Should be called after SetDisplay()
- * @return @c True on success, otherwise @c False
- * @remark The minimum value of width and height are 1.
- */
- virtual bool ResizeRenderRect(const RenderRect& rect) { return false; }
-
- /**
* @brief Set the rotate angle of display
* @remarks The default value is 0.
* @param [in] rotate : Rotate angle.
}
/**
- * @brief Set the request frame rate of decoded video
- * @remarks Only works when decoded video frame buffer type is scale
- * @param [in] request_framerate : the request frame rate of returned decoded video frame
- * The value of track_framerate and request_framerate should be one of the following sets:
- * track_framerate indicate the frame rate of input video stream
- * 1.A/(A-B) = X ,X means drop 1 frame every X frame
- * 2.Special cases,such as 24000/1000 -> 15000/1000
- * when request_framerate.num = 0, return none decoded video frame.
- * when request_framerate.num/request_framerate.den =
- * track_framerate.num/track_framerate.den, return all decoded
- * video frame.
- * when request_framerate.num/request_framerate.den <
- * track_framerate.num/track_framerate.den, drop some decoded
- * video frame.
- * @pre The player state must be not #EsState::kNone
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetDecodedVideoFrameRate(const Rational& request_framerate) {
- return false;
- }
-
- /**
- * @brief Set the target scale resolution when decoded video frame buffer
- * type is scale
- * @param [in] target_width : target width of scale.
- * @param [in] target_height : target height of scale.
- * @pre The player state must be set to #EsState::kIdle
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetVideoFrameBufferScaleResolution(
- const uint32_t& target_width, const uint32_t& target_height) {
- return false;
- }
-
- /**
* @brief Register eventlistener to player
* @param [in] listener : listener object
* @param [in] userdata : listener object's userdata to be returned via
virtual bool SetVideoCodecType(const PlayerVideoCodecType& type) {
return false;
}
- /**
- * @brief Provided api for setting alternative video resource(sub decoder
- * and sub scaler)
- * @param [in] is_set : set alternative video resource
- * (@c 0 [defualt] = set all video resources(decoder/scaler) to
- * main resources,
- * @c 1 = set all video resources(decoder/scaler) to sub
- * resources,
- * @c 2 = set only decoder to sub resource,
- * @c 3 = set only scaler to sub resource)
- * @pre The player state can be all of #EsState except #EsState::kNone
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetAlternativeVideoResource(unsigned int rsc_type) {
- return false;
- }
- /**
- * @brief Provided api for switching audio stream between the different
- * audio codec types on the fly
- * @param [in] stream : audio stream object
- * @remark Audio stream can be switched between only #AudioMimeType::kAAC,
- * #AudioMimeType::kEac3 and #AudioMimeType::kAC3.
- * if other codec type is set, this api will return false.
- * @pre The player state must be one of #EsState::kReady,
- * #EsState::kPlaying, #EsState::kPaused.
- * @return @c True on success, otherwise @c False
- */
- virtual bool SwitchAudioStreamOnTheFly(const AudioStreamPtr& stream) {
- return false;
- }
-
- /**
- * @brief Provided api for setting aifilter to video pipeline
- * @pre The player state must be set to #EsState::kIdle.
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetAiFilter(void* aifilter) { return false; }
- /**
- * @brief Provided api for setting render time offset
- * @param [in] type : stream type
- * @param [in] offset : offset (milisecond).
- * @pre The player state must be set to #EsState::kReady,
- * #EsState::kPaused or #EsState::kPlaying.
- * It have to be set to low latency mode.
- * @remark esplusplayer_set_low_latency_mode().
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetRenderTimeOffset(const StreamType type, int64_t offset) {
- return false;
- }
- /**
- * @brief Provided api for getting render time offset
- * @param [in] type : stream type
- * @param [in] offset : offset ptr (milisecond).
- * @pre The player state must be set to #EsState::kReady,
- * #EsState::kPaused or #EsState::kPlaying.
- * It have to be set to low latency mode.
- * @remark esplusplayer_set_low_latency_mode().
- * @return @c True on success, otherwise @c False
- */
- virtual bool GetRenderTimeOffset(const StreamType type, int64_t* offset) {
- return false;
- }
-
- /**
- * @brief Provided api for setting catch up speed level
- * @pre The player state must be set to #EsState::kIdle,
- * #EsState::kReady, #EsState::kPlaying or #EsState::kPaused
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetCatchUpSpeed(const CatchUpSpeed& level) { return false; }
- /**
- * @brief Provided api for getting current video latency status
- * @pre The player state must be one of #EsState::kReady,
- * #EsState::kPlaying or #EsState::kPaused
- * @return @c True on success, otherwise @c False
- */
- virtual bool GetVideoLatencyStatus(LatencyStatus* status) { return false; }
- /**
- * @brief Provided api for getting current audio latency status
- * @pre The player state must be one of #EsState::kReady,
- * #EsState::kPlaying or #EsState::kPaused
- * @return @c True on success, otherwise @c False
- */
- virtual bool GetAudioLatencyStatus(LatencyStatus* status) { return false; }
- /**
- * @brief Provided api for setting video mid latency threshold for low
- * latency playback
- * @pre The player state must be set to #EsState::kIdle,
- * #EsState::kReady, #EsState::kPlaying or #EsState::kPaused
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetVideoMidLatencyThreshold(const unsigned int threshold) {
- return false;
- }
-
- /**
- * @brief Provided api for setting audio mid latency threshold for low
- * latency playback
- * @pre The player state must be set to #EsState::kIdle,
- * #EsState::kReady, #EsState::kPlaying or #EsState::kPaused
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetAudioMidLatencyThreshold(const unsigned int threshold) {
- return false;
- }
-
- /**
- * @brief Provided api for setting video high latency threshold for low
- * latency playback
- * @pre The player state must be set to #EsState::kIdle,
- * #EsState::kReady, #EsState::kPlaying or #EsState::kPaused
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetVideoHighLatencyThreshold(const unsigned int threshold) {
- return false;
- }
-
- /**
- * @brief Provided api for setting audio high latency threshold for low
- * latency playback
- * @pre The player state must be set to #EsState::kIdle,
- * #EsState::kReady, #EsState::kPlaying or #EsState::kPaused
- * @return @c True on success, otherwise @c False
- */
- virtual bool SetAudioHighLatencyThreshold(const unsigned int threshold) {
- return false;
- }
-
- /**
- * @brief Provided api for initializing audio easing information
- * @param [in] init_volume : initial volume
- * @param [in] init_elapsed_time : initail elapsed time (milisecond).
- * @param [in] easing_info : target_volume, duration(milisecond), easing
- * type
- * @pre The player state can be all of #EsState except #EsState::kNone
- * @return @c True on success, otherwise @c False
- */
- virtual bool InitAudioEasingInfo(const uint32_t init_volume,
- const uint32_t init_elapsed_time,
- const AudioEasingInfo& easing_info) {
- return false;
- }
-
- /**
- * @brief Provided api for updating audio easing information
- * @param [in] easing_info : target_volume, duration(milisecond), easing
- * type
- * @pre The player state can be all of #EsState except #EsState::kNone
- * @remarks This API have to be called after calling the
- * EsPlusPlayer::InitAudioEasingInfo()
- * @return @c True on success, otherwise @c False
- */
- virtual bool UpdateAudioEasingInfo(const AudioEasingInfo& easing_info) {
- return false;
- }
-
- /**
- * @brief Provided api for getting audio easing information
- * @param [out] current_volume : current volume
- * @param [out] elapsed_time : elapsed time (milisecond).
- * @param [out] easing_info : target_volume, duration(milisecond), easing
- * type
- * @pre The player state can be all of #EsState except #EsState::kNone
- * @remarks This API have to be called after calling the
- * EsPlusPlayer::InitAudioEasingInfo()
- * @return @c True on success, otherwise @c False
- */
- virtual bool GetAudioEasingInfo(uint32_t* current_volume,
- uint32_t* elapsed_time,
- AudioEasingInfo* easing_info) {
- return false;
- }
-
- /**
- * @brief Provided api for starting audio easing
- * @pre The player state should be at least #EsState::kReady
- * @remarks This API have to be called after calling the
- * EsPlusPlayer::InitAudioEasingInfo()
- * @return @c True on success, otherwise @c False
- */
- virtual bool StartAudioEasing() { return false; }
-
- /**
- * @brief Provided api for stopping audio easing
- * @pre The player state can be all of #EsState except #EsState::kNone
- * @remarks This API have to be called after calling the
- * EsPlusPlayer::InitAudioEasingInfo()
- * @return @c True on success, otherwise @c False
- */
- virtual bool StopAudioEasing() { return false; }
-
- /**
- * @brief Get virtual resource id
- * @param [in] type : The resource type of virtual id.
- * @param [out] virtual_id : Stored virtual resource id value.
- * @pre The player state should be #EsState::kReady, #EsState::kPlaying
- * or #EsState::kPaused
- * @post None
- * @return @c True on success, otherwise @c False ("virtual_id" will be -1)
- * @exception None
- */
- virtual bool GetVirtualRscId(const RscType type, int* virtual_id) {
- return false;
- }
-
- /**
- * @brief Set advanced picture quality type.
- * @param [in] type : The picture quality type.
- * @pre The player state must be set to #EsState::kIdle.
- * @post None
- * @return @c True on success, otherwise @c False
- * @exception None
- */
- virtual bool SetAdvancedPictureQualityType(const AdvPictureQualityType type) {
- return false;
- }
-
- /**
- * @brief Set resource allocate policy.
- * @param [in] policy : The resource allocate policy.
- * @pre The player state must be set to #EsState::kIdle.
- * @post None
- * @return @c True on success, otherwise @c False
- * @exception None
- */
- virtual bool SetResourceAllocatePolicy(const RscAllocPolicy policy) {
- return false;
- }
protected:
EsPlusPlayer() noexcept {};
/**
-* @file
+* @file
* @interfacetype module
* @privlevel None-privilege
* @privilege None
* @SDK_Support N
*
* Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-* PROPRIETARY/CONFIDENTIAL
+* PROPRIETARY/CONFIDENTIAL
* This software is the confidential and proprietary
* information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
* not disclose such Confidential Information and shall use it only in
bool use_swdecoder = false;
std::string language_code;
std::string subtitle_format;
+ std::string stream_format;
+ std::string alignment;
+ std::string original_media_type;
+ std::string protection_system;
Track() {};
Track(int _index, int _id, std::string _mimetype, std::string _streamtype, std::string _container_type,
TrackType _type, std::shared_ptr<char> _codec_data, unsigned int _codec_tag, int _codec_data_len,
int _width, int _height, int _maxwidth, int _maxheight, int _framerate_num, int _framerate_den,
int _sample_rate, int _sample_format, int _channels, int _version, int _layer, int _bits_per_sample,
int _block_align, int _bitrate, int _endianness, bool _is_signed, bool _active, bool _use_swdecoder,
- std::string _language_code, std::string _subtitle_format)
+ std::string _language_code, std::string _subtitle_format, std::string _stream_format, std::string _alignment,
+ std::string _original_media_type, std::string _protection_system)
: index(_index), id(_id), mimetype(_mimetype), streamtype(_streamtype), container_type(_container_type),
type(_type), codec_data(_codec_data), codec_tag(_codec_tag), codec_data_len(_codec_data_len),
width(_width), height(_height), maxwidth(_maxwidth), maxheight(_maxheight), framerate_num(_framerate_num), framerate_den(_framerate_den),
sample_rate(_sample_rate), sample_format(_sample_format), channels(_channels), version(_version), layer(_layer), bits_per_sample(_bits_per_sample),
block_align(_block_align), bitrate(_bitrate), endianness(_endianness), is_signed(_is_signed), active(_active), use_swdecoder(_use_swdecoder),
- language_code(_language_code), subtitle_format(_subtitle_format) {};
+ language_code(_language_code), subtitle_format(_subtitle_format), stream_format(_stream_format), alignment(_alignment),
+ original_media_type(_original_media_type), protection_system(_protection_system) {};
};
enum SubtitleAttrType {
/**
-* @file
+* @file
* @interfacetype module
* @privlevel None-privilege
* @privilege None
* @SDK_Support N
*
* Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-* PROPRIETARY/CONFIDENTIAL
+* PROPRIETARY/CONFIDENTIAL
* This software is the confidential and proprietary
* information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
* not disclose such Confidential Information and shall use it only in
+++ /dev/null
-/**
-* @file
-* @interfacetype module
-* @privlevel None-privilege
-* @privilege None
-* @product TV, AV, B2B
-* @version 3.0
-* @SDK_Support N
-*
-* Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
-* PROPRIETARY/CONFIDENTIAL
-* This software is the confidential and proprietary
-* information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
-* not disclose such Confidential Information and shall use it only in
-* accordance with the terms of the license agreement you entered into with
-* SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
-* suitability of the software, either express or implied, including but not
-* limited to the implied warranties of merchantability, fitness for a
-* particular purpose, or non-infringement. SAMSUNG shall not be liable for any
-* damages suffered by licensee as a result of using, modifying or distributing
-* this software or its derivatives.
-*/
-
-#ifndef __PLUSPLAYER_TYPES_LATENCY_H__
-#define __PLUSPLAYER_TYPES_LATENCY_H__
-
-namespace plusplayer {
-
-enum class CatchUpSpeed {
- kNone,
- kSlow,
- kNormal,
- kFast
-};
-
-enum class LatencyStatus {
- kLow,
- kMid,
- kHigh
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_TYPES_LATENCY_H__
\ No newline at end of file
+++ /dev/null
-/**
-* @file
-* @interfacetype module
-* @privlevel None-privilege
-* @privilege None
-* @product TV, AV, B2B
-* @version 1.0
-* @SDK_Support N
-*
-* Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-* PROPRIETARY/CONFIDENTIAL
-* This software is the confidential and proprietary
-* information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
-* not disclose such Confidential Information and shall use it only in
-* accordance with the terms of the license agreement you entered into with
-* SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
-* suitability of the software, either express or implied, including but not
-* limited to the implied warranties of merchantability, fitness for a
-* particular purpose, or non-infringement. SAMSUNG shall not be liable for any
-* damages suffered by licensee as a result of using, modifying or distributing
-* this software or its derivatives.
-*/
-
-#ifndef __PLUSPLAYER_PICTUREQUALITY_H__
-#define __PLUSPLAYER_PICTUREQUALITY_H__
-
-namespace plusplayer {
-
-/**
-* @brief Advanced Picture Quality Type.
-*/
-enum class AdvPictureQualityType {
- kVideoCall,
- kUsbCamera
-};
-
-} // namespace plusplayer
-#endif // __PLUSPLAYER_PICTUREQUALITY_H__
\ No newline at end of file
+++ /dev/null
-/**
- * @file
- * @brief the stream information for playback
- * @interfacetype Module
- * @privlevel None-privilege
- * @privilege None
- * @product TV, AV, B2B
- * @version 3.0
- * @SDK_Support N
- *
- * Copyright (c) 2020 Samsung Electronics Co., Ltd All Rights Reserved
- * PROPRIETARY/CONFIDENTIAL
- * This software is the confidential and proprietary
- * information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
- * not disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into with
- * SAMSUNG ELECTRONICS. SAMSUNG make no representations or warranties about the
- * suitability of the software, either express or implied, including but not
- * limited to the implied warranties of merchantability, fitness for a
- * particular purpose, or non-infringement. SAMSUNG shall not be liable for any
- * damages suffered by licensee as a result of using, modifying or distributing
- * this software or its derivatives.
- */
-#ifndef __PLUSPLAYER_TYPES_RESOURCE_H__
-#define __PLUSPLAYER_TYPES_RESOURCE_H__
-
-namespace plusplayer {
-
-/**
- * @brief Enumerations for the resource type
- */
-enum class RscType { kVideoRenderer };
-
-/**
- * @brief Enumerations for resource allocate policy
- */
-enum class RscAllocPolicy {
- /**
- * @description exclusive policy, default policy
- */
- kRscAllocExclusive,
- /**
- * @description conditional policy
- */
- kRscAllocConditional,
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_TYPES_RESOURCE_H__
\ No newline at end of file
* @SDK_Support N
*
* Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
-* PROPRIETARY/CONFIDENTIAL
+* PROPRIETARY/CONFIDENTIAL
* This software is the confidential and proprietary
* information of SAMSUNG ELECTRONICS ("Confidential Information"). You shall
* not disclose such Confidential Information and shall use it only in
# %bcond_with : disable ESPLUSPLAYER_UT by default, %bcond_without : enable ESPLUSPLAYER_UT
-%if ("%{_vd_cfg_product_type}" != "AUDIO")
%bcond_without ESPLUSPLAYER_UT
-%else
-%bcond_with ESPLUSPLAYER_UT
-%endif
-#echo "Product Type: %{_vd_cfg_product_type}"
Name: esplusplayer
Summary: new multimedia streaming player
Version: 0.0.1
Source0: %{name}-%{version}.tar.gz
Source1001: esplusplayer.manifest
BuildRequires: cmake
-BuildRequires: curl
BuildRequires: pkgconfig(glib-2.0)
BuildRequires: pkgconfig(capi-base-common)
BuildRequires: pkgconfig(gstreamer-1.0)
BuildRequires: pkgconfig(ecore-wl2)
BuildRequires: pkgconfig(wayland-client)
BuildRequires: pkgconfig(tizen-extension-client)
-BuildRequires: pkgconfig(tv-resource-manager)
-BuildRequires: pkgconfig(tv-resource-information)
BuildRequires: pkgconfig(libtzplatform-config)
BuildRequires: pkgconfig(jsoncpp)
-BuildRequires: pkgconfig(gstreamer-ffsubtitle-1.0)
BuildRequires: pkgconfig(icu-i18n)
-BuildRequires: pkgconfig(drmdecrypt)
BuildRequires: pkgconfig(vconf)
-BuildRequires: pkgconfig(logger)
+BuildRequires: pkgconfig(capi-system-info)
BuildRequires: pkgconfig(gio-2.0)
BuildRequires: pkgconfig(libtbm)
-BuildRequires: pkgconfig(lwipc)
-BuildRequires: pkgconfig(capi-screensaver)
-BuildRequires: pkgconfig(context-aware-api)
-BuildRequires: pkgconfig(capi-trackrenderer-tv)
-BuildRequires: pkgconfig(libtbm)
-BuildRequires: pkgconfig(smart-deadlock)
+BuildRequires: pkgconfig(libtrackrenderer)
-%if ("%{_vd_cfg_product_type}" != "AUDIO")
-BuildRequires: pkgconfig(graphics-control)
-%endif
-%if ("%{_vd_cfg_licensing}" == "n")
# for ut
-BuildRequires: pkgconfig(capi-media-player)
-BuildRequires: pkgconfig(gtest_gmock)
+#BuildRequires: pkgconfig(capi-media-player)
+#BuildRequires: pkgconfig(gtest_gmock)
BuildRequires: pkgconfig(appcore-efl)
-BuildRequires: pkgconfig(libresourced)
-%endif
+#BuildRequires: pkgconfig(libresourced)
+BuildRequires: pkgconfig(gmock)
+BuildRequires: pkgconfig(libinput)
+BuildRequires: pkgconfig(gstreamer-app-1.0)
%define _packagedir /usr
%define _bindir %{_packagedir}/bin
%description config
-#################################################
-# gcov
-#################################################
-%if 0%{?vd_gcov:1}
-%package gcov
-Summary: gcov enabled package
-Group: gcov package
-
-%description gcov
-This package is gcov package for coverage measurement.
-%endif
-
%prep
%setup -q
cp %{SOURCE1001} .
-%if ("%{_vd_cfg_licensing}" == "n")
-%if ("%{_vd_cfg_product_type}" != "AUDIO")
-%{?!TOMATO: %define TOMATO n}
-
-%define _tomatoname esplusplayer
-%define _tomatodir /opt/usr/apps/tomato/testcase/%{name}
-%define _tomatobin /opt/usr/apps/tomato/testcase/%{name}/bin
-
-%package ut-component-tomato
-Summary: Test package with TOMATO
-BuildRequires: pkgconfig(tomato)
-BuildRequires: pkgconfig(gtest_gmock)
-BuildRequires: pkgconfig(video-capture)
-BuildRequires: pkgconfig(audio-control)
-BuildRequires: libjpeg-turbo-devel
-BuildRequires: elementary-devel
-BuildRequires: opencv-devel
-BuildRequires: pkgconfig(opencv)
-BuildRequires: pkgconfig(capi-appfw-application)
-Requires: %{name} = %{version}-%{release}
-
-%description ut-component-tomato
-This package is for test
-
-%files ut-component-tomato
-%defattr(-,root,root,-)
-%{_bindir}/esplusplayer_ut
-%{_tomatodir}/*
-
-%endif
-%endif
%build
export CFLAGS+=" -Wno-deprecated-declarations"
export CXXFLAGS+=" -Wno-deprecated-declarations"
-%if ("%{_vd_cfg_product_type}" == "AUDIO")
-export CFLAGS+=" -DIS_AUDIO_PRODUCT"
-export CXXFLAGS+=" -DIS_AUDIO_PRODUCT"
-%define PRODUCT_TYPE_AUDIO yes
-%else
-%define PRODUCT_TYPE_AUDIO no
-%endif
-
-%if ("%{_vd_cfg_product_type}" == "AV")
-export CFLAGS+=" -DIS_AV_PRODUCT"
-export CXXFLAGS+=" -DIS_AV_PRODUCT"
-%endif
-
-%if 0%{?vd_gcov:1}
-export CFLAGS+=" -fprofile-arcs -ftest-coverage"
-export CXXFLAGS+=" -fprofile-arcs -ftest-coverage"
-export FFLAGS+=" -fprofile-arcs -ftest-coverage"
-export LDFLAGS+=" -lgcov"
-export CFLAGS+=" -DIS_TOMATO"
-export CXXFLAGS+=" -DIS_TOMATO"
-%endif
-
export CXXFLAGS+=" -Wno-pessimizing-move"
-
-%if ("%{_vd_cfg_licensing}" == "n")
%if %{with ESPLUSPLAYER_UT}
-%cmake . -DESPLUSPLAYER_BUILD_UT=ON -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO
-%else
-%cmake . -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO
-%endif
+%cmake . -DESPLUSPLAYER_BUILD_UT=ON
%else
-%cmake . -DPRODUCT_TYPE_AUDIO=%PRODUCT_TYPE_AUDIO
+%cmake .
%endif
make %{?jobs:-j%jobs}
%install
rm -rf %{buildroot}
-%if ("%{_vd_cfg_licensing}" == "n")
-mkdir -p %{buildroot}%{_tomatodir}
-mkdir -p %{buildroot}%{_tomatodir}/log
-mkdir -p %{buildroot}%{_tomatodir}/result
-mkdir -p %{buildroot}%{_tomatodir}/tc
-cp -rf tomato/tc/* %{buildroot}%{_tomatodir}/tc
-%endif
-
%make_install
mkdir -p %{buildroot}%TZ_SYS_RO_ETC/multimedia
-#mkdir -p %{buildroot}%TZ_SYS_RW_APP/multimedia
-#mkdir -p %{buildroot}/opt
-#mkdir -p %{buildroot}/opt/usr
-#mkdir -p %{buildroot}/opt/usr/home
-#mkdir -p %{buildroot}/opt/usr/home/owner
-#mkdir -p %{buildroot}/opt/usr/home/owner/models
cp -rf config/esplusplayer.ini %{buildroot}%TZ_SYS_RO_ETC/multimedia/esplusplayer.ini
-%if 0%{?vd_gcov:1}
-mkdir -p %{buildroot}%{_datadir}/gcov/obj
-find . \( -name '*.gcno' -o -name '*.cpp' -o -name '*.c' -o -name '*.hpp' -o -name '*.h' \) ! -path "./ut/*" ! -path "./test/*" ! -path "*/CompilerIdCXX/*" -exec cp --parents -r '{}' %{buildroot}%{_datadir}/gcov/obj ';'
-%endif
-
%files
%defattr(-,root,root,-)
%manifest esplusplayer.manifest
%license LICENSE.APLv2
%{_libdir}/libespplayer-core.so
%{_libdir}/libesplusplayer.so
-%if ("%{_vd_cfg_product_type}" != "AUDIO")
-%{_libdir}/libmixer.so
-%endif
-
%TZ_SYS_RO_ETC/multimedia/esplusplayer.ini
-#%attr(0775, owner,users) %TZ_SYS_RW_APP/multimedia
-#remove esplusplayer_ut in esplusplayer package by flash memory issue
-#%if ("%{_vd_cfg_licensing}" == "n")
-#%if %{with ESPLUSPLAYER_UT}
-#%{_bindir}/esplusplayer_ut
-#%defattr(-,root,root,-)
-#%{_tomatodir}/*
-#%endif
-#%endif
+%if %{with ESPLUSPLAYER_UT}
+%{_bindir}/esplusplayer_ut
+%defattr(-,root,root,-)
+%endif
%files devel
%defattr(-,root,root,-)
%{_includedir}/esplusplayer_capi/*.h
-%{_includedir}/mixer/*.h
-%{_includedir}/mixer_capi/*.h
%{_pkgconfigdir}/esplusplayer.pc
%files config
%manifest esplusplayer.manifest
%license LICENSE.APLv2
%TZ_SYS_RO_ETC/multimedia/esplusplayer.ini
-%attr(0775, owner,users) %TZ_SYS_RO_ETC/multimedia
-
-%if 0%{?vd_gcov:1}
-%files gcov
-%{_datadir}/gcov/*
-%endif
ADD_SUBDIRECTORY(plusplayer-core)
-ADD_SUBDIRECTORY(esplusplayer)
-IF(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
-ADD_SUBDIRECTORY(mixer)
-ENDIF(${PRODUCT_TYPE_AUDIO} STREQUAL)
+ADD_SUBDIRECTORY(esplusplayer)
\ No newline at end of file
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
SET(${fw_name}_LDFLAGS)
-IF(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
SET(ADD_LIBS
"espplayer-core"
"trackrenderer"
- "mixer"
)
-ELSE(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
-SET(ADD_LIBS
- "espplayer-core"
- "trackrenderer"
-)
-ENDIF(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
SET(${fw_name}_CXXFLAGS "-Wall -Werror -std=c++11 -fPIC -fno-lto -Wl,-z,relro -fstack-protector -DEFL_BETA_API_SUPPORT")
SET(dependents "gstreamer-1.0 glib-2.0 dlog"
"boost"
- "tv-resource-manager"
"elementary ecore ecore-wl2"
"jsoncpp")
#include <vector>
#include "core/decoderinputbuffer.h"
-#include "core/kpi.h"
#include "core/trackrendereradapter.h"
-#ifndef IS_AUDIO_PRODUCT
-#include "mixer/mixerticket.h"
-#include "mixer/mixerticket_eventlistener.h"
-#endif
#include "esplayer/espacket_logger.h"
#include "esplayer/message.hpp"
#include "esplayer/state_manager.hpp"
#include "plusplayer/drm.h"
#include "plusplayer/esplusplayer.h"
#include "plusplayer/track.h"
+
#include "plusplayer/types/buffer.h"
#include "plusplayer/types/display.h"
#include "plusplayer/types/error.h"
void SetAppInfo(const PlayerAppInfo& app_info) override;
bool SetPlaybackRate(const double rate, const bool audio_mute) override;
bool SetDisplay(const DisplayType& type, void* obj) override;
-#ifndef IS_AUDIO_PRODUCT
- bool SetDisplay(const DisplayType& type, MixerTicket* handle) override;
-#endif
bool SetDisplay(const DisplayType& type, void* ecore_wl2_window, const int x,
const int y, const int w, const int h) override;
- bool SetDisplaySubsurface(const DisplayType& type, void* ecore_wl2_subsurface,
- const int x, const int y, const int w,
- const int h) override;
bool SetDisplay(const DisplayType& type, unsigned int surface_id, const int x,
const int y, const int w, const int h) override;
bool SetDisplayMode(const DisplayMode& mode) override;
bool SetDisplayRoi(const Geometry& roi) override;
bool SetVideoRoi(const CropArea& area) override;
- bool ResizeRenderRect(const RenderRect& rect) override;
bool SetDisplayRotate(const DisplayRotation& rotate) override;
bool GetDisplayRotate(DisplayRotation* rotate) override;
bool SetDisplayVisible(bool is_visible) override;
bool GetPlayingTime(uint64_t* time_in_milliseconds) override;
bool SetAudioMute(bool is_mute) override;
bool SetVideoFrameBufferType(DecodedVideoFrameBufferType type) override;
- bool SetVideoFrameBufferScaleResolution(
- const uint32_t& target_width, const uint32_t& target_height) override;
- bool SetDecodedVideoFrameRate(const Rational& request_framerate) override;
void RegisterListener(EsEventListener* listener,
EsEventListener::UserData userdata) override;
bool GetAdaptiveInfo(void* padaptive_info,
bool SetFmmMode() override;
bool SetAudioCodecType(const PlayerAudioCodecType& type) override;
bool SetVideoCodecType(const PlayerVideoCodecType& type) override;
- bool SetRenderTimeOffset(const StreamType type, int64_t offset) override;
- bool GetRenderTimeOffset(const StreamType type, int64_t* offset) override;
- bool SetAlternativeVideoResource(unsigned int rsc_type) override;
- bool SwitchAudioStreamOnTheFly(const AudioStreamPtr& stream) override;
- bool SetAiFilter(void* aifilter) override;
- bool SetCatchUpSpeed(const CatchUpSpeed& level) override;
- bool GetVideoLatencyStatus(LatencyStatus* status) override;
- bool GetAudioLatencyStatus(LatencyStatus* status) override;
- bool SetVideoMidLatencyThreshold(const unsigned int threshold) override;
- bool SetAudioMidLatencyThreshold(const unsigned int threshold) override;
- bool SetVideoHighLatencyThreshold(const unsigned int threshold) override;
- bool SetAudioHighLatencyThreshold(const unsigned int threshold) override;
- bool InitAudioEasingInfo(const uint32_t init_volume,
- const uint32_t init_elapsed_time,
- const AudioEasingInfo& easing_info) override;
- bool UpdateAudioEasingInfo(const AudioEasingInfo& easing_info) override;
- bool GetAudioEasingInfo(uint32_t* current_volume, uint32_t* elapsed_time,
- AudioEasingInfo* easing_info) override;
- bool StartAudioEasing() override;
- bool StopAudioEasing() override;
- bool GetVirtualRscId(const RscType type, int* virtual_id) override;
- bool SetAdvancedPictureQualityType(const AdvPictureQualityType type) override;
- bool SetResourceAllocatePolicy(const RscAllocPolicy policy) override;
private:
using SubmitPacketOperator =
std::uint64_t kMaxTimeOfAudioSrcQueue = 0;
std::uint32_t kMinTimeThresholdOfVideoSrcQueue = 0;
std::uint32_t kMinTimeThresholdOfAudioSrcQueue = 0;
+
+ std::uint64_t kMaxBufferOfVideoSrcQueue = 0;
+ std::uint64_t kMaxBufferOfAudioSrcQueue = 0;
};
private:
void ResetContextForStop_();
void GetSrcQueueCurrentSize_(const TrackType& type, uint64_t* byte_size,
uint64_t* time_size);
- kpi::EsCodecLoggerKeys MakeKpiKeys_();
-#ifndef IS_AUDIO_PRODUCT
- bool PrepareVideoMixingMode_(std::vector<Track>* tracks);
-#endif
private: // private types
class TrackRendererEventListener
assert(handler);
}
void OnError(const ErrorType& error_code) override;
- void OnErrorMsg(const ErrorType& error_code, char* error_msg) override;
void OnResourceConflicted() override;
void OnEos() override;
void OnSeekDone() override;
void OnEvent(const EventType& event_type,
const EventMsg& msg_data) override;
void OnFirstDecodingDone() override;
- void OnVideoDecoderUnderrun() override;
- void OnVideoLatencyStatus(const LatencyStatus& latency_status) override;
- void OnAudioLatencyStatus(const LatencyStatus& latency_status) override;
- void OnVideoHighLatency() override;
- void OnAudioHighLatency() override;
-#ifndef IS_AUDIO_PRODUCT
- void OnMediaPacketVideoRawDecoded(
- const DecodedVideoRawModePacket& packet) override;
-#endif
private:
void ReadyToPrepare_(const TrackType& type);
void ReadyToSeek_(const TrackType& type);
void BufferStatus_(const TrackType& type, const BufferStatus& status);
void OnMediaPacketVideoDecoded(const DecodedVideoPacket& packet);
- void OnMediaPacketGetTbmBufPtr(void** ptr, bool is_scale_change);
private:
EsPlayer* handler_ = nullptr;
}; // class TrackRendererEventListener
-#ifndef IS_AUDIO_PRODUCT
- class MixerListener : public MixerTicketEventListener {
- public:
- explicit MixerListener(EsPlayer* handler) : handler_(handler) {
- assert(handler);
- }
- bool OnAudioFocusChanged(bool active) override;
- bool OnUpdateDisplayInfo(const DisplayInfo& cur_info,
- DisplayInfo* new_info) override;
-
- private:
- EsPlayer* handler_{nullptr};
- };
-#endif
-
private:
std::vector<Track> track_;
NeedData need_data_[kTrackTypeMax];
std::unique_ptr<TrackRendererEventListener> trackrenderer_event_listener_{
new TrackRendererEventListener(this)};
-#ifndef IS_AUDIO_PRODUCT
- std::unique_ptr<MixerListener> mixer_event_listener_{new MixerListener(this)};
-#endif
std::unique_ptr<TrackRendererAdapter> trackrenderer_;
std::future<void> preparetask_;
PlayerAppInfo app_info_;
SrcQueueSize src_queue_size_;
std::string caf_unique_number;
-#ifndef IS_AUDIO_PRODUCT
- std::unique_ptr<MixerTicket> mixer_ticket_;
- bool is_audio_focused_ = true;
- Geometry mixerticket_roi_;
- bool is_visible_ = true;
- std::mutex audio_focus_m_;
- bool enable_audio_pipeline_handle_ = true;
- bool enable_rsc_alloc_handle_ = true;
-#endif
DecodedVideoFrameBufferType vidoe_frame_buffer_type_ =
DecodedVideoFrameBufferType::kNone;
// for debugging
: Base(userdata), type(_type), op(_op) {}
};
-struct ErrorMsg : Base {
- using Ptr = std::unique_ptr<ErrorMsg>;
- using Operator =
- std::function<void(const ErrorType&, const char*, Base::UserData)>;
-
- static Base::Ptr Make(const ErrorType& error_type, const char* error_msg,
- size_t size, const Operator& op,
- const Base::UserData userdata) {
- return Base::Ptr(new ErrorMsg(error_type, error_msg, size, op, userdata));
- }
- void Execute() override {
- if (!op) return;
- op(type, message, userdata_);
- }
-
- const ErrorType type = ErrorType::kNone;
- const char* message = nullptr;
- const Operator op;
-
- private:
- explicit ErrorMsg(const ErrorType& _type, const char* _msg, size_t _size,
- const Operator& _op, const Base::UserData userdata)
- : Base(userdata), type(_type), op(_op) {
- message = new const char[_size + 1]{0};
- memcpy((void*)message, _msg, _size);
- }
-
- ~ErrorMsg() {
- delete[] message;
- message = nullptr;
- }
-};
-
struct Bufferstatus : Base {
using Ptr = std::unique_ptr<Bufferstatus>;
using Operator = std::function<void(StreamType, BufferStatus, uint64_t,
}
};
-struct PacketLatencyStatus : Base {
- using Ptr = std::unique_ptr<PacketLatencyStatus>;
- using Operator = std::function<void(LatencyStatus, Base::UserData)>;
-
- static Base::Ptr Make(const LatencyStatus latency_status, const Operator& op,
- const Base::UserData userdata) {
- return Base::Ptr(new PacketLatencyStatus(latency_status, op, userdata));
- }
- void Execute() override {
- if (!op) return;
- op(latency_status, userdata_);
- }
-
- const LatencyStatus latency_status = LatencyStatus::kLow;
- const Operator op;
-
- private:
- explicit PacketLatencyStatus(const LatencyStatus _latency_status,
- const Operator& _op,
- const Base::UserData userdata)
- : Base(userdata), latency_status(_latency_status), op(_op) {}
-};
-
} // namespace es_msg
} // namespace plusplayer
\r
#include "esplayer/espacket_logger.h"\r
\r
+#include <inttypes.h>\r
#include <sstream>\r
#include <thread>\r
#include <utility>\r
(force) || (count == 1) || (count % kLogBufferThreshold == 0);\r
if (in_timing) {\r
const auto logmsg = GetStringFromLastPacketInfo_(type);\r
- LOG_INFO("<pktinfo - %llu %s> [%s] %s", count, (force ? ": last" : ""),\r
+ LOG_INFO("<pktinfo - %" PRIu64 " %s> [%s] %s", count, (force ? ": last" : ""),\r
(type == StreamType::kAudio ? "AUDIO" : "VIDEO"), logmsg.c_str());\r
}\r
}\r
#include "core/gst_utils.h"
#include "core/track_util.h"
-#include "core/utils/caf_logger.h"
#include "core/utils/performance_checker.h"
#include "core/utils/plusplayer_cfg.h"
#include "core/utils/plusplayer_log.h"
-#include "core/videoframetypestrategy.h"
#include "esplayer/esplayer_drm.h"
#include "json/json.h"
EsPlayer::EsPlayer() {
std::call_once(es_conf::loaded, [this]() { es_conf::LoadIniFile(); });
- if (CafLogger::Initialize() != true) {
- LOG_INFO("CAF Dbus not connect.");
- }
}
EsPlayer::~EsPlayer() {
performance_checker::End(start, "Open");
return true;
};
- CafLogger::SetUniqueNumber();
- caf_unique_number = CafLogger::GetUniqueNumber();
- CafLogger::LogMessage(CafEventType::kIdle, caf_unique_number);
-
es_event::Open event{op};
return state_manager_.ProcessEvent(event);
}
state_manager_.GetStateEnum());
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (!enable_audio_pipeline_handle_ && type == StreamType::kAudio) {
- LOG_ERROR_P(
- this, "can't deactivate audio stream, mixer will control audio stream");
- return false;
- }
-#endif
if (!trackrenderer_->Deactivate(static_cast<TrackType>(type))) {
return false;
}
state_manager_.GetStateEnum());
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (!enable_audio_pipeline_handle_ && type == StreamType::kAudio) {
- LOG_ERROR_P(this,
- "can't activate audio stream, mixer will control audio stream");
- return false;
- }
-#endif
if (!track_.empty()) {
auto has_track = [type](const Track& item) -> bool {
return item.type == static_cast<TrackType>(type);
internal::UpdateCodecTypeTracks(track_, audio_codec_type_,
video_codec_type_,
force_audio_swdecoder_use_);
- if (drm_property_.external_decryption) {
- internal::MakeTrustZoneTracks(track_, app_info_.id);
- }
SetTrackRendererAttributes_();
-#ifndef IS_AUDIO_PRODUCT
- if (type == StreamType::kVideo) {
- if (mixer_ticket_)
- trackrenderer_->SetVideoFrameBufferType(
- VideoFrameTypeStrategyPtr(new RawVideoFrameTypeStrategy()));
- else
- trackrenderer_->SetVideoFrameBufferType(VideoFrameTypeStrategyPtr(
- new DefaultVideoFrameTypeStrategy(vidoe_frame_buffer_type_)));
- }
-#endif
if (!trackrenderer_->Activate(target->type, *target)) {
target->active = false;
return false;
}
return true;
};
-
- CafLogger::LogMessage(CafEventType::kPlaying, caf_unique_number);
-
es_event::Start event{op};
return state_manager_.ProcessEvent(event);
}
const auto start = performance_checker::Start();
if (trackrenderer_) trackrenderer_->Stop();
ResetContextForStop_();
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) mixer_ticket_.reset();
-#endif
performance_checker::End(start, "Stop");
return true;
};
LOG_INFO_P(this, "Wait , Wait Prepare() Done...");
}
- CafLogger::LogMessage(CafEventType::kIdle, caf_unique_number);
- CafLogger::StopLoggingThread();
-
return res;
}
TrackRendererAdapter::Attribute::kAudioMinByteThreshold,
src_queue_size_.kMinByteThresholdOfAudioSrcQueue);
trackrenderer_->SetAttribute(
+ TrackRendererAdapter::Attribute::kVideoQueueMaxBuffer,
+ src_queue_size_.kMaxBufferOfVideoSrcQueue);
+ trackrenderer_->SetAttribute(
+ TrackRendererAdapter::Attribute::kAudioQueueMaxBuffer,
+ src_queue_size_.kMaxBufferOfAudioSrcQueue);
+#if 0
+ trackrenderer_->SetAttribute(
TrackRendererAdapter::Attribute::kVideoQueueMaxTime,
util::ConvertMsToNs(src_queue_size_.kMaxTimeOfVideoSrcQueue));
trackrenderer_->SetAttribute(
src_queue_size_.kMinTimeThresholdOfAudioSrcQueue);
trackrenderer_->SetAttribute(TrackRendererAdapter::Attribute::kLowLatencyMode,
low_latency_mode_);
+#endif
trackrenderer_->SetAttribute(
TrackRendererAdapter::Attribute::kVideoFramePeekMode,
video_frame_peek_mode_);
}
trackrenderer_->SetAttribute(TrackRendererAdapter::Attribute::kFmmMode,
fmm_mode_);
+#if 0
trackrenderer_->SetAttribute(
TrackRendererAdapter::Attribute::kAlternativeVideoResource,
alternaltive_video_resource_);
trackrenderer_->SetAttribute(
TrackRendererAdapter::Attribute::kVideoDecodingMode,
video_decoding_mode_);
-}
-
-#ifndef IS_AUDIO_PRODUCT
-bool EsPlayer::PrepareVideoMixingMode_(std::vector<Track>* tracks) {
- LOG_ENTER_P(this);
- mixer_ticket_->Prepare();
- if (enable_rsc_alloc_handle_) return true;
- ResourceType type = ResourceType::kHwMain;
- if (!mixer_ticket_->GetAvailableResourceType(ResourceCategory::kVideoDecoder,
- &type)) {
- LOG_ERROR_P(this, "no available resource");
- return false;
- }
- if (!mixer_ticket_->Alloc(ResourceCategory::kVideoDecoder, type)) {
- LOG_ERROR_P(this, "fail to alloc resource [%d]", static_cast<int>(type));
- return false;
- }
+#endif
- if (type == ResourceType::kHwSub) {
- alternaltive_video_resource_ = 1;
- } else if (type == ResourceType::kSw) {
- for (auto it = tracks->begin(); it != tracks->end(); ++it) {
- if (it->type == kTrackTypeVideo) {
- it->use_swdecoder = true;
- break;
- }
- }
- } else if (type == ResourceType::kNdecoder) {
- video_decoding_mode_ = internal::kNdecodingMode;
- }
- return true;
}
-#endif
bool EsPlayer::Prepare_() {
LOG_ENTER_P(this);
return false;
}
trackrenderer_->SetIniProperty(es_conf::ini_property);
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) {
- trackrenderer_->SetVideoFrameBufferType(
- VideoFrameTypeStrategyPtr(new RawVideoFrameTypeStrategy()));
- if (!PrepareVideoMixingMode_(&active_track)) {
- LOG_ERROR_P(this, "fail to prepare mixing mode");
- return false;
- }
- }
- std::unique_lock<std::mutex> lock(audio_focus_m_);
- if (!enable_audio_pipeline_handle_ && !is_audio_focused_) {
- for (auto it = active_track.begin(); it != active_track.end(); ++it) {
- if (it->type == kTrackTypeAudio) {
- active_track.erase(it);
- LOG_INFO_P(this, "erase audio track is_audio_focused_ [%d]",
- is_audio_focused_);
- break;
- }
- }
- }
-#endif
for (const auto& track : active_track) {
switch (track.type) {
case kTrackTypeAudio: {
performance_checker::End(start, "Prepare");
return true;
};
-
- CafLogger::StartLoggingThread();
- CafLogger::LogMessage(CafEventType::kReady, caf_unique_number);
-
es_event::Prepare event{op};
if (!state_manager_.ProcessEvent(event)) {
return false;
eventlistener_->OnPrepareDone(ret, eventlistener_userdata_);
}
- kpi::CodecLogger logger;
- kpi::EsCodecLoggerKeys event_keys = MakeKpiKeys_();
- logger.SendKpi(ret, event_keys);
LOG_LEAVE_P(this);
}
es_packet_logger_.PrintStoredPacketInfo(
internal::ConvertToStreamType(track.type), true);
}
-
- CafLogger::LogMessage(CafEventType::kPaused, caf_unique_number);
-
es_event::Pause event{op};
return state_manager_.ProcessEvent(event);
}
es_packet_logger_.PrintStoredPacketInfo(
internal::ConvertToStreamType(track.type), true);
}
-
- CafLogger::LogMessage(CafEventType::kPlaying, caf_unique_number);
-
es_event::Resume event{op};
return state_manager_.ProcessEvent(event);
}
resume_time_.time = time_millisecond;
return true;
}
- is_seek_done_need_drop = true;
LOG_DEBUG_P(this, "[ENTER] seek time [%llu ms]", time_millisecond);
for (const auto& track : track_) {
eos_status_ = internal::ResetEosStatus(track.type, eos_status_);
return true;
};
es_event::Seek event{op};
- bool ret = state_manager_.ProcessEvent(event);
- is_seek_done_need_drop = false;
-
- if (eventlistener_) {
- if (internal::IsLowLatencyModeDisableAVSync(low_latency_mode_) ||
- internal::IsLowLatencyModeDisablePreroll(low_latency_mode_)) {
- auto listener = std::bind(&plusplayer::EsEventListener::OnSeekDone,
- eventlistener_, std::placeholders::_1);
- auto msg = es_msg::Simple::Make(listener, eventlistener_userdata_);
- std::unique_lock<std::mutex> msg_mutex(msg_task_mutex_);
- msg_queue_.push(std::move(msg));
- msg_mutex.unlock();
- msg_task_cv_.notify_one();
- }
- }
- LOG_DEBUG_P(this, "[LEAVE] seek end [%llu ms]", time_millisecond);
- return ret;
+ return state_manager_.ProcessEvent(event);
}
void EsPlayer::SetAppInfo(const PlayerAppInfo& app_info) {
app_info_ = app_info;
trackrenderer_->SetAppInfo(app_info);
LOG_INFO("Appid [%s]", app_info.id.c_str());
- CafLogger::SetAppId(app_info.id);
}
bool EsPlayer::SetPlaybackRate(const double rate, const bool audio_mute) {
state_manager_.GetStateEnum());
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) mixer_ticket_.reset();
-#endif
return trackrenderer_->SetDisplay(type, obj);
}
-#ifndef IS_AUDIO_PRODUCT
-bool EsPlayer::SetDisplay(const DisplayType& type, MixerTicket* handle) {
- if (type == DisplayType::kMixer) {
- LOG_INFO_P(this, "Create MixerTicket");
- mixer_ticket_.reset(handle);
- mixer_ticket_->RegisterListener(mixer_event_listener_.get());
- if (mixer_ticket_->IsAudioFocusHandler())
- enable_audio_pipeline_handle_ = false;
- if (mixer_ticket_->IsRscAllocHandler()) enable_rsc_alloc_handle_ = false;
- trackrenderer_->SetDisplay(DisplayType::kNone, nullptr);
- }
- return true;
-}
-#endif
-
bool EsPlayer::SetDisplay(const DisplayType& type, void* ecore_wl2_window,
const int x, const int y, const int w, const int h) {
if (state_manager_.GetState() != EsState::kIdle) {
state_manager_.GetStateEnum());
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) mixer_ticket_.reset();
-#endif
return trackrenderer_->SetDisplay(type, ecore_wl2_window, x, y, w, h);
}
-bool EsPlayer::SetDisplaySubsurface(const DisplayType& type,
- void* ecore_wl2_subsurface, const int x,
- const int y, const int w, const int h) {
- if (state_manager_.GetState() != EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) mixer_ticket_.reset();
-#endif
- return trackrenderer_->SetDisplaySubsurface(type, ecore_wl2_subsurface, x, y,
- w, h);
-}
-
bool EsPlayer::SetDisplay(const DisplayType& type, unsigned int surface_id,
const int x, const int y, const int w, const int h) {
if (state_manager_.GetState() != EsState::kIdle) {
state_manager_.GetStateEnum());
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) mixer_ticket_.reset();
-#endif
return trackrenderer_->SetDisplay(type, surface_id, x, y, w, h);
}
state_manager_.GetStateEnum());
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) {
- LOG_INFO_P(this, "mixed player roi x[%d] y[%d] w[%d] h[%d]", roi.x, roi.y,
- roi.w, roi.h);
- mixerticket_roi_ = roi;
- return true;
- }
-#endif
return trackrenderer_->SetDisplayRoi(roi);
}
return trackrenderer_->SetVideoRoi(area);
}
-bool EsPlayer::ResizeRenderRect(const RenderRect& rect) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- return trackrenderer_->ResizeRenderRect(rect);
-}
-
bool EsPlayer::SetDisplayRotate(const DisplayRotation& rotate) {
if (state_manager_.GetState() < EsState::kIdle) {
LOG_ERROR_P(this, "Invalid State , current %d",
state_manager_.GetStateEnum());
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (mixer_ticket_) {
- LOG_INFO_P(this, "mixed player is_visible [%d] -> [%d]", is_visible_,
- is_visible);
- is_visible_ = is_visible;
- return true;
- }
-#endif
return trackrenderer_->SetDisplayVisible(is_visible);
}
if (type == SubmitDataType::kCleanData) return true;
submit_data_type_ = type;
- drm_property_.type = drm::Type::kPlayready;
- // TODO: following SubmitDataType, need to set external_decryption
- drm_property_.external_decryption = true;
- drm::Property drm_property = drm_property_;
- trackrenderer_->SetDrm(drm_property);
+ if (type == SubmitDataType::kEncryptedData) {
+ drm_property_.type = drm::Type::kPlayready;
+ // TODO: following SubmitDataType, need to set external_decryption
+ drm_property_.external_decryption = true;
+ drm::Property drm_property = drm_property_;
+ trackrenderer_->SetDrm(drm_property);
+ }
return true;
}
}
return true;
};
-
- CafLogger::LogMessage(CafEventType::kStreamReady, caf_unique_number);
-
es_event::SetStream event{op};
return state_manager_.ProcessEvent(event);
}
return SetStream_(track);
}
-bool EsPlayer::SwitchAudioStreamOnTheFly(const AudioStreamPtr& stream) {
- LOG_ENTER_P(this);
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- Track track = stream->GetTrack_();
-
- if (!internal::IsAvailableCodecSwitch(track)) {
- LOG_ERROR_P(this, "Invalid new mimetype [%s][%d]", track.mimetype.c_str(),
- track.version);
- return false;
- }
- for (auto& old_track : track_) {
- if (old_track.type == TrackType::kTrackTypeAudio) {
- if (!internal::IsAvailableCodecSwitch(old_track)) {
- LOG_ERROR_P(this, "Invalid previous mimetype [%s][%d]",
- old_track.mimetype.c_str(), old_track.version);
- return false;
- }
- if (!Flush(StreamType::kAudio)) return false;
- old_track.active = false;
- break;
- }
- }
- if (!ChangeStream_(track)) return false;
-
- trackrenderer_->SetTrack(track_);
- return true;
-}
-
-bool EsPlayer::SetAdvancedPictureQualityType(const AdvPictureQualityType type) {
- LOG_ENTER_P(this);
- if (state_manager_.GetState() != EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- trackrenderer_->SetAdvancedPictureQualityType(type);
- return true;
-}
-
-bool EsPlayer::SetResourceAllocatePolicy(const RscAllocPolicy policy) {
- LOG_ENTER_P(this);
- if (state_manager_.GetState() != EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- trackrenderer_->SetResourceAllocatePolicy(policy);
- return true;
-}
void EsPlayer::ResetContextForClose_() {
internal::ResetDrmProperty(drm_property_);
trackrenderer_->GetAttribute(
TrackRendererAdapter::Attribute::kVideoQueueCurrentLevelByte,
&byte_size_);
- trackrenderer_->GetAttribute(
- TrackRendererAdapter::Attribute::kVideoQueueCurrentLevelTime,
- &time_size_);
} else if (type == TrackType::kTrackTypeAudio) {
trackrenderer_->GetAttribute(
TrackRendererAdapter::Attribute::kAudioQueueCurrentLevelByte,
&byte_size_);
- trackrenderer_->GetAttribute(
- TrackRendererAdapter::Attribute::kAudioQueueCurrentLevelTime,
- &time_size_);
} else
return;
*byte_size = boost::any_cast<std::uint64_t>(byte_size_);
- *time_size = boost::any_cast<std::uint64_t>(time_size_);
- *time_size = util::ConvertNsToMs(*time_size);
+ *time_size = 0;
}
GstBuffer* EsPlayer::GetGstBuffer_(const EsPacketPtr& packet,
}
bool EsPlayer::SetVideoFrameBufferType(DecodedVideoFrameBufferType type) {
- if ((state_manager_.GetState() != EsState::kIdle &&
- type != DecodedVideoFrameBufferType::kScale) ||
- (state_manager_.GetState() < EsState::kIdle &&
- type == DecodedVideoFrameBufferType::kScale)) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- if (type == DecodedVideoFrameBufferType::kScale &&
- video_codec_type_ == kPlayerVideoCodecTypeSW) {
- LOG_ERROR_P(this, "kScale is not supportted when using sw video decoder");
- return false;
- }
- trackrenderer_->SetVideoFrameBufferType(
- VideoFrameTypeStrategyPtr(new DefaultVideoFrameTypeStrategy(type)));
- vidoe_frame_buffer_type_ = type;
- return true;
-}
-
-bool EsPlayer::SetVideoFrameBufferScaleResolution(
- const uint32_t& target_width, const uint32_t& target_height) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- return trackrenderer_->SetVideoFrameBufferScaleResolution(target_width,
- target_height);
-}
-
-bool EsPlayer::SetDecodedVideoFrameRate(const Rational& request_framerate) {
- if (state_manager_.GetState() < EsState::kIdle) {
+ if (state_manager_.GetState() != EsState::kIdle) {
LOG_ERROR("Invalid State , current %d", state_manager_.GetStateEnum());
return false;
}
-
- return trackrenderer_->SetDecodedVideoFrameRate(request_framerate);
+ trackrenderer_->SetVideoFrameBufferType(type);
+ return true;
}
void EsPlayer::RegisterListener(EsEventListener* listener,
return false;
}
return trackrenderer_->GetDroppedFrames(padaptive_info);
- case PlayerAdaptiveInfo::kDroppedVideoFramesForCatchup:
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Wrong state, we aren't started yet");
- return false;
- }
- return trackrenderer_->GetDroppedFramesForCatchup(kTrackTypeVideo,
- padaptive_info);
- case PlayerAdaptiveInfo::kDroppedAudioFramesForCatchup:
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Wrong state, we aren't started yet");
- return false;
- }
- return trackrenderer_->GetDroppedFramesForCatchup(kTrackTypeAudio,
- padaptive_info);
default:
break;
}
return true;
}
-bool EsPlayer::SetRenderTimeOffset(const StreamType type, int64_t offset) {
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- if (!internal::IsSupportedTsOffset(low_latency_mode_)) {
- LOG_ERROR_P(this,
- "low latency mode have to be set except disable_sync mode");
- return false;
- }
- constexpr std::int64_t ns_unit = 1000000;
- if ((offset * ns_unit > G_MAXINT64) || (offset * ns_unit < G_MININT64)) {
- LOG_ERROR_P(
- this, "wrong value : G_MAXINT64 < offset[%lld] * 1000000 < G_MAXINT64",
- offset);
- return false;
- }
- if (type == StreamType::kMax) return false;
- if (type == StreamType::kAudio)
- trackrenderer_->SetAttribute(
- TrackRendererAdapter::Attribute::kAudioRenderTimeOffset,
- util::ConvertMsToNs(offset));
- else if (type == StreamType::kVideo)
- trackrenderer_->SetAttribute(
- TrackRendererAdapter::Attribute::kVideoRenderTimeOffset,
- util::ConvertMsToNs(offset));
- return true;
-}
-
-bool EsPlayer::GetRenderTimeOffset(const StreamType type, int64_t* offset) {
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- if (!internal::IsSupportedTsOffset(low_latency_mode_)) {
- LOG_ERROR_P(this, "low latency mode have to be set");
- return false;
- }
- if (type == StreamType::kMax) return false;
- boost::any off_set;
- if (type == StreamType::kAudio)
- trackrenderer_->GetAttribute(
- TrackRendererAdapter::Attribute::kAudioRenderTimeOffset, &off_set);
- else if (type == StreamType::kVideo)
- trackrenderer_->GetAttribute(
- TrackRendererAdapter::Attribute::kVideoRenderTimeOffset, &off_set);
-
- *offset = boost::any_cast<std::int64_t>(off_set);
- *offset = util::ConvertNsToMs(*offset);
- return true;
-}
-
bool EsPlayer::SetVideoFramePeekMode() {
if (state_manager_.GetState() != EsState::kIdle) {
LOG_ERROR_P(this, "Invalid State , current %d",
"type is scale");
return false;
}
-#ifndef IS_AUDIO_PRODUCT
- if (!enable_rsc_alloc_handle_) {
- LOG_ERROR_P(this, "player can't control resource type, mixer will do it");
- return false;
- }
- if (type == kPlayerVideoCodecTypeHWNdecoding) {
- LOG_INFO_P(this, "PlayerVideoCodecType HW N-decoding");
- video_decoding_mode_ = internal::kNdecodingMode;
- return true;
- }
-#endif
LOG_INFO_P(this, "PlayerVideoCodecType [%s]",
(type == kPlayerVideoCodecTypeHW) ? "hardware" : "software");
video_codec_type_ = type;
return true;
}
-bool EsPlayer::SetAiFilter(void* aifilter) {
- if (state_manager_.GetState() != EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- trackrenderer_->SetAiFilter(aifilter);
- return true;
-}
-
-bool EsPlayer::InitAudioEasingInfo(const uint32_t init_volume,
- const uint32_t init_elapsed_time,
- const AudioEasingInfo& easing_info) {
- if (init_volume > internal::kVolumeMax ||
- easing_info.target_volume > internal::kVolumeMax) {
- LOG_ERROR_P(this, "Invalid volume: init [%d] target [%d]", init_volume,
- easing_info.target_volume);
- return false;
- }
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- return trackrenderer_->InitAudioEasingInfo(init_volume, init_elapsed_time,
- easing_info);
-}
-
-bool EsPlayer::UpdateAudioEasingInfo(const AudioEasingInfo& easing_info) {
- if (easing_info.target_volume > internal::kVolumeMax) {
- LOG_ERROR_P(this, "Invalid volume level %d", easing_info.target_volume);
- return false;
- }
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- return trackrenderer_->UpdateAudioEasingInfo(easing_info);
-}
-
-bool EsPlayer::GetAudioEasingInfo(uint32_t* current_volume,
- uint32_t* elapsed_time,
- AudioEasingInfo* easing_info) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- return trackrenderer_->GetAudioEasingInfo(current_volume, elapsed_time,
- easing_info);
-}
-
-bool EsPlayer::StartAudioEasing() {
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- return trackrenderer_->StartAudioEasing();
-}
-
-bool EsPlayer::StopAudioEasing() {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
- return trackrenderer_->StopAudioEasing();
-}
-
-bool EsPlayer::SetAlternativeVideoResource(unsigned int rsc_type) {
- if (state_manager_.GetState() == EsState::kNone) {
- LOG_ERROR_P(this, "Invalid State");
- return false;
- }
-#ifndef IS_AUDIO_PRODUCT
- if (!enable_rsc_alloc_handle_) {
- LOG_ERROR_P(this, "player can't control resource type, mixer will do it");
- return false;
- }
-#endif
- alternaltive_video_resource_ = static_cast<std::uint32_t>(rsc_type);
- return true;
-}
-
-bool EsPlayer::SetCatchUpSpeed(const CatchUpSpeed& level) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- if (false == internal::IsSetLowLatencyModeForCatchUp(low_latency_mode_)) {
- LOG_ERROR_P(this, "Do not set low latency mode, current[%u]",
- static_cast<std::uint32_t>(low_latency_mode_));
- return false;
- }
-
- if (trackrenderer_->SetCatchUpSpeed(level)) {
- return true;
- }
- return false;
-}
-
-bool EsPlayer::GetVideoLatencyStatus(LatencyStatus* status) {
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- if (trackrenderer_->GetVideoLatencyStatus(status)) {
- return true;
- }
- return false;
-}
-
-bool EsPlayer::GetAudioLatencyStatus(LatencyStatus* status) {
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- if (trackrenderer_->GetAudioLatencyStatus(status)) {
- return true;
- }
- return false;
-}
-
-bool EsPlayer::SetVideoMidLatencyThreshold(const unsigned int threshold) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- if (false == internal::IsSetLowLatencyModeForCatchUp(low_latency_mode_)) {
- LOG_ERROR_P(this, "Don't set low latency mode, current[%u]",
- static_cast<std::uint32_t>(low_latency_mode_));
- return false;
- }
-
- LOG_INFO_P(this, "video_mid_latency_threshold : [%u]", threshold);
-
- trackrenderer_->SetVideoMidLatencyThreshold(threshold);
- return true;
-}
-
-bool EsPlayer::SetAudioMidLatencyThreshold(const unsigned int threshold) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- if (false == internal::IsSetLowLatencyModeForCatchUp(low_latency_mode_)) {
- LOG_ERROR_P(this, "Don't set low latency mode, current[%u]",
- static_cast<std::uint32_t>(low_latency_mode_));
- return false;
- }
-
- LOG_INFO_P(this, "audio_mid_latency_threshold : [%u]", threshold);
-
- trackrenderer_->SetAudioMidLatencyThreshold(threshold);
- return true;
-}
-
-bool EsPlayer::SetVideoHighLatencyThreshold(const unsigned int threshold) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- if (false == internal::IsSetLowLatencyModeForCatchUp(low_latency_mode_)) {
- LOG_ERROR_P(this, "Don't set low latency mode, current[%u]",
- static_cast<std::uint32_t>(low_latency_mode_));
- return false;
- }
-
- LOG_INFO_P(this, "video_high_latency_threshold : [%u]", threshold);
-
- trackrenderer_->SetVideoHighLatencyThreshold(threshold);
- return true;
-}
-
-bool EsPlayer::SetAudioHighLatencyThreshold(const unsigned int threshold) {
- if (state_manager_.GetState() < EsState::kIdle) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- return false;
- }
-
- if (false == internal::IsSetLowLatencyModeForCatchUp(low_latency_mode_)) {
- LOG_ERROR_P(this, "Don't set low latency mode, current[%u]",
- static_cast<std::uint32_t>(low_latency_mode_));
- return false;
- }
-
- LOG_INFO_P(this, "audio_high_latency_threshold : [%u]", threshold);
-
- trackrenderer_->SetAudioHighLatencyThreshold(threshold);
- return true;
-}
-
-bool EsPlayer::GetVirtualRscId(const RscType type, int* virtual_id) {
- if (virtual_id == nullptr) return false;
- if (state_manager_.GetState() < EsState::kReady) {
- LOG_ERROR_P(this, "Invalid State , current %d",
- state_manager_.GetStateEnum());
- *virtual_id = -1;
- return false;
- }
- return trackrenderer_->GetVirtualRscId(type, virtual_id);
-}
-
void EsPlayer::Init_() {
track_.clear();
is_stopped_ = false;
void EsPlayer::TrackRendererEventListener::OnSeekDone() {
LOG_ENTER_P(handler_);
if (!handler_->eventlistener_) return;
- if (handler_->is_seek_done_need_drop == true) return;
auto listener = std::bind(&plusplayer::EsEventListener::OnSeekDone,
handler_->eventlistener_, std::placeholders::_1);
auto msg = es_msg::Simple::Make(listener, handler_->eventlistener_userdata_);
handler_->msg_task_cv_.notify_one();
}
-void EsPlayer::TrackRendererEventListener::OnErrorMsg(
- const ErrorType& error_code, char* error_msg) {
- if (!handler_->eventlistener_) return;
- if (error_code == ErrorType::kResourceLimit) return;
-
- std::vector<Track> activeTracks;
- track_util::GetActiveTrackList(handler_->track_, activeTracks);
-
- Json::Value message;
- message["error_code"] = (int)error_code;
-
- switch (error_code) {
- case ErrorType::kNotSupportedVideoCodec:
- for (const auto& track : activeTracks) {
- if (track.type == kTrackTypeVideo) {
- message["codec"] = track.mimetype.c_str();
- message["demux"] = track.container_type.c_str();
- char json_string[20] = {0};
- int nLen = 19;
- strncat(json_string, std::to_string(track.width).c_str(), nLen);
- nLen = sizeof(json_string) - strlen(json_string) - 1;
- if (nLen < 0) nLen = 0;
- strncat(json_string, "*", nLen);
- nLen = sizeof(json_string) - strlen(json_string) - 1;
- if (nLen < 0) nLen = 0;
- strncat(json_string, std::to_string(track.height).c_str(), nLen);
- message["resolution"] = json_string;
- memset(json_string, 0, sizeof(json_string));
- nLen = 19;
- strncat(json_string, std::to_string(track.framerate_num).c_str(),
- nLen);
- nLen = sizeof(json_string) - strlen(json_string) - 1;
- if (nLen < 0) nLen = 0;
- strncat(json_string, "/", nLen);
- nLen = sizeof(json_string) - strlen(json_string) - 1;
- if (nLen < 0) nLen = 0;
- strncat(json_string, std::to_string(track.framerate_den).c_str(),
- nLen);
- message["fps"] = json_string;
- message["detail_info"] = error_msg;
- break;
- }
- }
- break;
- case ErrorType::kNotSupportedAudioCodec:
-
- break;
- default:
- break;
- }
-
- Json::FastWriter writer;
- std::string str = writer.write(message);
- LOG_INFO_P(handler_, "error message: %s", str.c_str());
-
- auto listener = std::bind(&plusplayer::EsEventListener::OnErrorMsg,
- handler_->eventlistener_, std::placeholders::_1,
- std::placeholders::_2, std::placeholders::_3);
- auto msg =
- es_msg::ErrorMsg::Make(error_code, str.c_str(), str.size(), listener,
- handler_->eventlistener_userdata_);
-
- std::unique_lock<std::mutex> msg_mutex(handler_->msg_task_mutex_);
- handler_->msg_queue_.push(std::move(msg));
- msg_mutex.unlock();
- handler_->msg_task_cv_.notify_one();
-}
-
void EsPlayer::TrackRendererEventListener::ReadyToPrepare_(
const TrackType& type) {
LOG_INFO_P(handler_, "OnReadyToPrepare [%s]",
}
}
-void EsPlayer::TrackRendererEventListener::OnMediaPacketGetTbmBufPtr(
- void** tbm_ptr, bool is_scale_change) {
- if (!handler_->eventlistener_) return;
-
- handler_->eventlistener_->OnMediaPacketGetTbmBufPtr(tbm_ptr, is_scale_change);
-}
-
void EsPlayer::TrackRendererEventListener::OnMediaPacketVideoDecoded(
const DecodedVideoPacket& packet) {
if (!handler_->eventlistener_) return;
handler_->eventlistener_->OnMediaPacketVideoDecoded(packet);
}
-#ifndef IS_AUDIO_PRODUCT
-void EsPlayer::TrackRendererEventListener::OnMediaPacketVideoRawDecoded(
- const DecodedVideoRawModePacket& packet) {
- if (handler_->mixer_ticket_ == nullptr) return;
- const auto& data = packet.data;
- if (packet.type == DecodedVideoRawModePacketType::kPhysicalAddress) {
- DecodedRawInfo info;
- info.width = packet.width;
- info.height = packet.height;
- info.y_info.phyaddr = data.raw.y_phyaddr;
- info.y_info.viraddr = data.raw.y_viraddr;
- info.y_info.linesize = data.raw.y_linesize;
- info.uv_info.phyaddr = data.raw.uv_phyaddr;
- info.uv_info.viraddr = data.raw.uv_viraddr;
- info.uv_info.linesize = data.raw.uv_linesize;
- handler_->mixer_ticket_->Render(info);
- } else if (packet.type == DecodedVideoRawModePacketType::kTizenBuffer) {
- DecodedVideoKeyTypeInfo info;
- info.width = packet.width;
- info.height = packet.height;
- info.key = packet.data.tbm.key;
- handler_->mixer_ticket_->Render(info);
- }
-}
-
-bool EsPlayer::MixerListener::OnAudioFocusChanged(bool active) {
- LOG_INFO_P(handler_, "focused [%d]", active);
- std::unique_lock<std::mutex> lock(handler_->audio_focus_m_);
- if (handler_->state_manager_.GetState() < EsState::kReady) {
- handler_->is_audio_focused_ = active;
- return true;
- }
- if (active) {
- Track activated_track;
- track_util::GetActiveTrack(handler_->track_, kTrackTypeAudio,
- &activated_track);
- LOG_INFO_P(handler_, "Activate audio track");
- {
- std::lock_guard<std::mutex> lock2(handler_->eos_mutex_);
- handler_->eos_status_ =
- internal::ResetEosStatus(kTrackTypeAudio, handler_->eos_status_);
- }
- return handler_->trackrenderer_->Activate(kTrackTypeAudio, activated_track);
- }
- LOG_INFO_P(handler_, "Deactivate audio track");
- handler_->is_audio_focused_ = false;
- {
- std::lock_guard<std::mutex> lock2(handler_->eos_mutex_);
- handler_->eos_status_ |= EosStatus::kAudioEos;
- }
- return handler_->trackrenderer_->Deactivate(kTrackTypeAudio);
-}
-
-bool EsPlayer::MixerListener::OnUpdateDisplayInfo(const DisplayInfo& cur_info,
- DisplayInfo* new_info) {
- new_info->geometry = handler_->mixerticket_roi_;
- new_info->visible_status =
- handler_->is_visible_ ? VisibleStatus::kVisible : VisibleStatus::kHide;
- return true;
-}
-#endif
-
void EsPlayer::TrackRendererEventListener::OnSeekData(const TrackType& type,
const uint64_t offset) {
if (!handler_->eventlistener_) return;
LOG_LEAVE_P(handler_);
}
-void EsPlayer::TrackRendererEventListener::OnVideoDecoderUnderrun() {
- LOG_ENTER_P(handler_);
- if (!handler_->eventlistener_) return;
-
- if (handler_->state_manager_.GetState() != EsState::kPlaying &&
- handler_->state_manager_.GetState() != EsState::kPaused) {
- return;
- }
-
- auto listener =
- std::bind(&plusplayer::EsEventListener::OnVideoDecoderUnderrun,
- handler_->eventlistener_, std::placeholders::_1);
- auto msg = es_msg::Simple::Make(listener, handler_->eventlistener_userdata_);
- std::unique_lock<std::mutex> msg_mutex(handler_->msg_task_mutex_);
- handler_->msg_queue_.push(std::move(msg));
- msg_mutex.unlock();
- handler_->msg_task_cv_.notify_one();
- LOG_LEAVE_P(handler_);
-}
-
-void EsPlayer::TrackRendererEventListener::OnVideoLatencyStatus(
- const LatencyStatus& latency_status) {
- LOG_ENTER_P(handler_);
- if (!handler_->eventlistener_) return;
-
- if (handler_->state_manager_.GetState() != EsState::kPlaying &&
- handler_->state_manager_.GetState() != EsState::kPaused) {
- return;
- }
-
- auto listener = std::bind(&plusplayer::EsEventListener::OnVideoLatencyStatus,
- handler_->eventlistener_, std::placeholders::_1,
- std::placeholders::_2);
-
- auto msg = es_msg::PacketLatencyStatus::Make(
- latency_status, listener, handler_->eventlistener_userdata_);
-
- std::unique_lock<std::mutex> msg_mutex(handler_->msg_task_mutex_);
- handler_->msg_queue_.push(std::move(msg));
- msg_mutex.unlock();
- handler_->msg_task_cv_.notify_one();
- LOG_LEAVE_P(handler_);
-}
-
-void EsPlayer::TrackRendererEventListener::OnAudioLatencyStatus(
- const LatencyStatus& latency_status) {
- LOG_ENTER_P(handler_);
- if (!handler_->eventlistener_) return;
-
- if (handler_->state_manager_.GetState() != EsState::kPlaying &&
- handler_->state_manager_.GetState() != EsState::kPaused) {
- return;
- }
-
- auto listener = std::bind(&plusplayer::EsEventListener::OnAudioLatencyStatus,
- handler_->eventlistener_, std::placeholders::_1,
- std::placeholders::_2);
-
- auto msg = es_msg::PacketLatencyStatus::Make(
- latency_status, listener, handler_->eventlistener_userdata_);
-
- std::unique_lock<std::mutex> msg_mutex(handler_->msg_task_mutex_);
- handler_->msg_queue_.push(std::move(msg));
- msg_mutex.unlock();
- handler_->msg_task_cv_.notify_one();
- LOG_LEAVE_P(handler_);
-}
-
-void EsPlayer::TrackRendererEventListener::OnVideoHighLatency() {
- LOG_ENTER_P(handler_);
- if (!handler_->eventlistener_) return;
-
- auto listener = std::bind(&plusplayer::EsEventListener::OnVideoHighLatency,
- handler_->eventlistener_, std::placeholders::_1);
-
- auto msg = es_msg::Simple::Make(listener, handler_->eventlistener_userdata_);
-
- std::unique_lock<std::mutex> msg_mutex(handler_->msg_task_mutex_);
- handler_->msg_queue_.push(std::move(msg));
- msg_mutex.unlock();
- handler_->msg_task_cv_.notify_one();
- LOG_LEAVE_P(handler_);
-}
-
-void EsPlayer::TrackRendererEventListener::OnAudioHighLatency() {
- LOG_ENTER_P(handler_);
- if (!handler_->eventlistener_) return;
-
- auto listener = std::bind(&plusplayer::EsEventListener::OnAudioHighLatency,
- handler_->eventlistener_, std::placeholders::_1);
-
- auto msg = es_msg::Simple::Make(listener, handler_->eventlistener_userdata_);
-
- std::unique_lock<std::mutex> msg_mutex(handler_->msg_task_mutex_);
- handler_->msg_queue_.push(std::move(msg));
- msg_mutex.unlock();
- handler_->msg_task_cv_.notify_one();
- LOG_LEAVE_P(handler_);
-}
-
-kpi::EsCodecLoggerKeys EsPlayer::MakeKpiKeys_() {
- kpi::EsCodecLoggerKeys event_info;
- event_info.app_id = app_info_.id;
- if (submit_data_type_ == SubmitDataType::kCleanData) {
- event_info.is_clean = true;
- } else {
- event_info.is_clean = false;
- }
-
- for (const auto& track : track_) {
- if (track.type == kTrackTypeVideo) {
- event_info.v_codec = track.mimetype;
- event_info.v_codec_version = track.version;
- event_info.width = track.maxwidth;
- event_info.height = track.maxheight;
- } else if (track.type == kTrackTypeAudio) {
- event_info.a_codec = track.mimetype;
- }
- }
- return event_info;
-}
-
namespace es_conf {
void LoadIniProperty(const Json::Value& root) {
#include "core/utils/plusplayer_log.h"
#include "esplayer/decoded_pkt_list.h"
#include "esplusplayer_capi/esplusplayer_internal.h"
-#ifndef IS_TOMATO
-#include "mixer_capi/mixer_capi.h"
-#endif
#include "plusplayer/appinfo.h"
-#include "plusplayer/audioeasinginfo.h"
#include "plusplayer/drm.h"
#include "plusplayer/elementary_stream.h"
#include "plusplayer/espacket.h"
#include "plusplayer/types/buffer.h"
#include "plusplayer/types/display.h"
#include "plusplayer/types/error.h"
-#include "plusplayer/types/latency.h"
-#include "plusplayer/types/picturequality.h"
-#include "plusplayer/types/resource.h"
#include "plusplayer/types/stream.h"
-using plusplayer::AdvPictureQualityType;
-using plusplayer::AudioEasingInfo;
-using plusplayer::AudioEasingType;
using plusplayer::AudioMimeType;
using plusplayer::AudioStream;
using plusplayer::AudioStreamPtr;
using plusplayer::BufferStatus;
-using plusplayer::CatchUpSpeed;
using plusplayer::CropArea;
using plusplayer::DecodedPacketManagerInterface;
using plusplayer::DisplayMode;
using plusplayer::EsPacket;
using plusplayer::EsPacketPtr;
using plusplayer::EsState;
-using plusplayer::LatencyStatus;
using plusplayer::MatroskaColor;
using plusplayer::PlayerAdaptiveInfo;
using plusplayer::PlayerAppInfo;
-using plusplayer::PlayerAudioCodecType;
using plusplayer::PlayerLowLatencyMode;
-using plusplayer::PlayerVideoCodecType;
-using plusplayer::Rational;
-using plusplayer::RenderRect;
-using plusplayer::RscAllocPolicy;
-using plusplayer::RscType;
using plusplayer::StreamType;
using plusplayer::SubmitDataType;
using plusplayer::Track;
using plusplayer::VideoStreamPtr;
using plusplayer::drm::EsPlayerEncryptedInfo;
using plusplayer::drm::Type;
+using plusplayer::PlayerAudioCodecType;
+using plusplayer::PlayerVideoCodecType;
namespace util {
const std::unordered_map<esplusplayer_error_type, std::string> kErrorStringMap =
virtual void OnReadyToSeek(const StreamType& type, const uint64_t offset,
UserData userdata) {
LOG_ENTER
- LOG_INFO("offset : %llu", offset);
+ LOG_INFO("offset : %" PRIu64, offset);
std::unique_lock<std::mutex> lock(this->multi_seek_control.lock);
if (this->multi_seek_control.is_offset_valid == false ||
this->multi_seek_control.offset != offset) {
}
}
- virtual void OnVideoDecoderUnderrun(UserData userdata) {
- LOG_ENTER
- if (this->video_decoder_underrun_cb_)
- this->video_decoder_underrun_cb_(video_decoder_underrun_cb_userdata_);
- }
-
- virtual void OnVideoLatencyStatus(const LatencyStatus& latency_status,
- UserData userdata) {
- LOG_ENTER
- if (this->video_latency_status_cb_)
- this->video_latency_status_cb_(
- static_cast<esplusplayer_latency_status>(latency_status),
- video_latency_status_cb_userdata_);
- }
-
- virtual void OnAudioLatencyStatus(const LatencyStatus& latency_status,
- UserData userdata) {
- LOG_ENTER
- if (this->audio_latency_status_cb_)
- this->audio_latency_status_cb_(
- static_cast<esplusplayer_latency_status>(latency_status),
- audio_latency_status_cb_userdata_);
- }
-
- virtual void OnVideoHighLatency(UserData userdata) {
- LOG_ENTER
- if (this->video_high_latency_cb_)
- this->video_high_latency_cb_(video_high_latency_cb_userdata_);
- }
-
- virtual void OnAudioHighLatency(UserData userdata) {
- LOG_ENTER
- if (this->audio_high_latency_cb_)
- this->audio_high_latency_cb_(audio_high_latency_cb_userdata_);
- }
-
private:
static void DecodedPacketDeleter(esplusplayer_decoded_video_packet* packet) {
if (packet->surface_data != nullptr) {
esplusplayer_first_video_decoding_done_cb first_video_decoding_done_cb_ =
nullptr;
void* first_video_decoding_done_cb_userdata_ = nullptr;
- esplusplayer_decoder_underrun_cb video_decoder_underrun_cb_ = nullptr;
- void* video_decoder_underrun_cb_userdata_ = nullptr;
- esplusplayer_video_latency_status_cb video_latency_status_cb_ = nullptr;
- esplusplayer_audio_latency_status_cb audio_latency_status_cb_ = nullptr;
- void* video_latency_status_cb_userdata_ = nullptr;
- void* audio_latency_status_cb_userdata_ = nullptr;
- esplusplayer_video_high_latency_cb video_high_latency_cb_ = nullptr;
- esplusplayer_audio_high_latency_cb audio_high_latency_cb_ = nullptr;
- void* video_high_latency_cb_userdata_ = nullptr;
- void* audio_high_latency_cb_userdata_ = nullptr;
std::shared_ptr<DecodedPacketManagerInterface> decoded_pkt_mgr_;
esplusplayer_handle handle,
esplusplayer_first_video_decoding_done_cb first_video_decoding_done_cb,
void* userdata);
- friend int esplusplayer_set_video_decoder_underrun_cb(
- esplusplayer_handle handle,
- esplusplayer_decoder_underrun_cb video_decoder_underrun_cb,
- void* userdata);
- friend int esplusplayer_set_video_latency_status_cb(
- esplusplayer_handle pp,
- esplusplayer_video_latency_status_cb video_latency_status_cb,
- void* userdata);
- friend int esplusplayer_set_audio_latency_status_cb(
- esplusplayer_handle pp,
- esplusplayer_audio_latency_status_cb audio_latency_status_cb,
- void* userdata);
- friend int esplusplayer_set_video_high_latency_cb(
- esplusplayer_handle pp,
- esplusplayer_video_high_latency_cb video_high_latency_cb, void* userdata);
- friend int esplusplayer_set_audio_high_latency_cb(
- esplusplayer_handle pp,
- esplusplayer_audio_high_latency_cb audio_high_latency_cb, void* userdata);
};
struct EsPlusPlayerPriv {
int esplusplayer_seek(esplusplayer_handle handle, uint64_t time_ms) {
LOG_ENTER_P(cast_(handle))
if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO_P(cast_(handle), "time : %llu", time_ms);
+ LOG_INFO("[%p] > time : %" PRIu64, cast_(handle), time_ms);
update_ready_to_seek_offset(handle, time_ms);
return convert_return_type_(cast_(handle)->Seek(time_ms));
LOG_INFO_P(cast_(handle), "display type : %d, object : %p",
static_cast<int>(type), window);
-#if (!IS_AUDIO_PRODUCT) && (!IS_TOMATO)
- if (type == ESPLUSPLAYER_DISPLAY_TYPE_MIXER) {
- mixer_handle mixer_h = window;
- plusplayer::MixerTicket* ticket =
- (plusplayer::MixerTicket*)mixer_create_ticket(mixer_h, handle);
- if (is_null_(ticket)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- return convert_return_type_(
- cast_(handle)->SetDisplay(static_cast<DisplayType>(type), ticket));
- }
-#endif
return convert_return_type_(
cast_(handle)->SetDisplay(static_cast<DisplayType>(type), window));
}
static_cast<DisplayType>(type), window, x, y, width, height));
}
-int esplusplayer_set_display_ecore_subsurface(esplusplayer_handle handle,
- esplusplayer_display_type type,
- void* subsurface, int x, int y,
- int width, int height) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || is_null_(subsurface))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO_P(cast_(handle), "display type : %d, object : %p",
- static_cast<int>(type), subsurface);
-
- return convert_return_type_(cast_(handle)->SetDisplaySubsurface(
- static_cast<DisplayType>(type), subsurface, x, y, width, height));
-}
-
int esplusplayer_set_surface_display(esplusplayer_handle handle,
esplusplayer_display_type type,
unsigned int surface_id, int x, int y,
return convert_return_type_(cast_(handle)->SetVideoRoi(rio_area));
}
-int esplusplayer_resize_render_rect(esplusplayer_handle handle, int x, int y,
- int width, int height) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO_P(cast_(handle), "x : %d, y: %d, width : %d, height : %d", x, y,
- width, height);
-
- RenderRect rect;
- rect.x = x;
- rect.y = y;
- rect.w = width;
- rect.h = height;
-
- return convert_return_type_(cast_(handle)->ResizeRenderRect(rect));
-}
-
int esplusplayer_set_display_rotation(
esplusplayer_handle handle, esplusplayer_display_rotation_type rotation) {
LOG_ENTER_P(cast_(handle))
return convert_return_type_(cast_(handle)->SetDisplayVisible(visible));
}
-int esplusplayer_set_tz_use(esplusplayer_handle handle, bool using_tz) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO_P(cast_(handle), "using_tz : %s", using_tz ? "true" : "false");
- return convert_return_type_(cast_(handle)->SetTrustZoneUse(using_tz));
-}
-
int esplusplayer_set_submit_data_type(esplusplayer_handle handle,
esplusplayer_submit_data_type type) {
LOG_ENTER_P(cast_(handle))
return static_cast<esplusplayer_submit_status>(status);
}
-esplusplayer_submit_status esplusplayer_submit_trust_zone_packet(
- esplusplayer_handle handle, esplusplayer_es_packet* packet,
- uint32_t tz_handle) {
- if (is_null_(handle)) return ESPLUSPLAYER_SUBMIT_STATUS_NOT_PREPARED;
- auto packetptr = convert_espacket_(packet);
- if (packetptr == nullptr) {
- LOG_ERROR("packet converting failed");
- return ESPLUSPLAYER_SUBMIT_STATUS_INVALID_PACKET;
- }
- auto status = cast_(handle)->SubmitTrustZonePacket(packetptr, tz_handle);
- if (status != plusplayer::PacketSubmitStatus::kSuccess) {
- LOG_ERROR("SubmitPacket status isn't SUCCESS [%d]",
- static_cast<int>(status));
- }
- return static_cast<esplusplayer_submit_status>(status);
-}
-
esplusplayer_submit_status esplusplayer_submit_encrypted_packet(
esplusplayer_handle handle, esplusplayer_es_packet* packet,
esplusplayer_drm_info* drm_info) {
return convert_return_type_(ret);
}
-int esplusplayer_set_video_frame_buffer_scale_resolution(
- esplusplayer_handle handle, uint32_t target_width, uint32_t target_height) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || !target_width || !target_height)
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- LOG_INFO_P(cast_(handle), "target_width : %d, target_height: %d",
- target_width, target_height);
- return convert_return_type_(cast_(handle)->SetVideoFrameBufferScaleResolution(
- target_width, target_height));
-}
-
-int esplusplayer_set_decoded_video_frame_rate(
- esplusplayer_handle handle, esplusplayer_rational request_framerate) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO("request decoded video frame rate : %d/%d", request_framerate.num,
- request_framerate.den);
-
- Rational request_fps;
- request_fps.num = request_framerate.num;
- request_fps.den = request_framerate.den;
- return convert_return_type_(
- cast_(handle)->SetDecodedVideoFrameRate(request_fps));
-}
-
int esplusplayer_get_adaptive_info(
esplusplayer_handle handle, void* padaptive_info,
esplusplayer_adaptive_info_type adaptive_type) {
return convert_return_type_(true);
}
-int esplusplayer_set_video_decoder_underrun_cb(
- esplusplayer_handle handle,
- esplusplayer_decoder_underrun_cb video_decoder_underrun_cb,
- void* userdata) {
- LOG_ENTER_P(cast_(handle))
- listener_bridge* listener = nullptr;
- if (is_null_(handle) || is_null_(listener = listener_cast_(handle))) {
- LOG_ERROR("ESPlayer or Listener object is nil.");
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- }
- listener->video_decoder_underrun_cb_ = video_decoder_underrun_cb;
- listener->video_decoder_underrun_cb_userdata_ = userdata;
-
- return convert_return_type_(true);
-}
-int esplusplayer_set_video_latency_status_cb(
- esplusplayer_handle handle,
- esplusplayer_video_latency_status_cb video_latency_status_cb,
- void* userdata) {
- LOG_ENTER_P(cast_(handle))
- listener_bridge* listener = nullptr;
- if (is_null_(handle) || is_null_(listener = listener_cast_(handle))) {
- LOG_ERROR("ESPlayer or Listener object is nil.");
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- }
-
- listener->video_latency_status_cb_ = video_latency_status_cb;
- listener->video_latency_status_cb_userdata_ = userdata;
- return convert_return_type_(true);
-}
-
-int esplusplayer_set_audio_latency_status_cb(
- esplusplayer_handle handle,
- esplusplayer_audio_latency_status_cb audio_latency_status_cb,
- void* userdata) {
- LOG_ENTER_P(cast_(handle))
- listener_bridge* listener = nullptr;
- if (is_null_(handle) || is_null_(listener = listener_cast_(handle))) {
- LOG_ERROR("ESPlayer or Listener object is nil.");
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- }
-
- listener->audio_latency_status_cb_ = audio_latency_status_cb;
- listener->audio_latency_status_cb_userdata_ = userdata;
- return convert_return_type_(true);
-}
-
-int esplusplayer_set_video_high_latency_cb(
- esplusplayer_handle handle,
- esplusplayer_video_high_latency_cb video_high_latency_cb, void* userdata) {
- LOG_ENTER_P(cast_(handle))
- listener_bridge* listener = nullptr;
- if (is_null_(handle) || is_null_(listener = listener_cast_(handle))) {
- LOG_ERROR("ESPlayer or Listener object is nil.");
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- }
-
- listener->video_high_latency_cb_ = video_high_latency_cb;
- listener->video_high_latency_cb_userdata_ = userdata;
- return convert_return_type_(true);
-}
-
-int esplusplayer_set_audio_high_latency_cb(
- esplusplayer_handle handle,
- esplusplayer_audio_high_latency_cb audio_high_latency_cb, void* userdata) {
- LOG_ENTER_P(cast_(handle))
- listener_bridge* listener = nullptr;
- if (is_null_(handle) || is_null_(listener = listener_cast_(handle))) {
- LOG_ERROR("ESPlayer or Listener object is nil.");
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- }
-
- listener->audio_high_latency_cb_ = audio_high_latency_cb;
- listener->audio_high_latency_cb_userdata_ = userdata;
- return convert_return_type_(true);
-}
-
int esplusplayer_decoded_buffer_destroy(
esplusplayer_handle handle, esplusplayer_decoded_video_packet* packet) {
if (is_null_(handle)) {
return convert_return_type_(ret);
}
-int esplusplayer_set_aifilter(esplusplayer_handle handle, void* aifilter) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || is_null_(aifilter))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- auto ret = cast_(handle)->SetAiFilter(aifilter);
- return convert_return_type_(ret);
-}
-
int esplusplayer_set_video_codec_type(esplusplayer_handle handle,
esplusplayer_video_codec_type type) {
LOG_ENTER_P(cast_(handle))
cast_(handle)->SetVideoCodecType(static_cast<PlayerVideoCodecType>(type));
return convert_return_type_(ret);
}
-
-int esplusplayer_set_alternative_video_resource(esplusplayer_handle handle,
- unsigned int rsc_type) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- auto ret = cast_(handle)->SetAlternativeVideoResource(rsc_type);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_set_render_time_offset(esplusplayer_handle handle,
- esplusplayer_stream_type type,
- int64_t offset) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- auto ret =
- cast_(handle)->SetRenderTimeOffset(static_cast<StreamType>(type), offset);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_get_render_time_offset(esplusplayer_handle handle,
- esplusplayer_stream_type type,
- int64_t* offset) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || is_null_(offset))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- auto ret =
- cast_(handle)->GetRenderTimeOffset(static_cast<StreamType>(type), offset);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_switch_audio_stream_onthefly(
- esplusplayer_handle handle, esplusplayer_audio_stream_info* info) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || is_null_(info))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- auto stream = convert_stream_ptr_(info);
- auto ret = cast_(handle)->SwitchAudioStreamOnTheFly(std::move(stream));
- return convert_return_type_(ret);
-}
-
-int esplusplayer_init_audio_easing_info(
- esplusplayer_handle handle, uint32_t init_volume, uint32_t elapsed_time,
- const esplusplayer_target_audio_easing_info* easing_info) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- if (easing_info == nullptr) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- AudioEasingInfo info;
- info.target_volume = easing_info->volume;
- info.duration = easing_info->duration;
- info.type = static_cast<AudioEasingType>(easing_info->type);
- auto ret =
- cast_(handle)->InitAudioEasingInfo(init_volume, elapsed_time, info);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_update_audio_easing_info(
- esplusplayer_handle handle,
- const esplusplayer_target_audio_easing_info* easing_info) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- if (easing_info == nullptr) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- AudioEasingInfo info;
- info.target_volume = easing_info->volume;
- info.duration = easing_info->duration;
- info.type = static_cast<AudioEasingType>(easing_info->type);
-
- auto ret = cast_(handle)->UpdateAudioEasingInfo(info);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_get_audio_easing_info(
- esplusplayer_handle handle, uint32_t* current_volume,
- uint32_t* elapsed_time,
- esplusplayer_target_audio_easing_info* easing_info) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- if (is_null_(current_volume) || is_null_(elapsed_time) ||
- is_null_(easing_info))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- AudioEasingInfo info;
- auto ret =
- cast_(handle)->GetAudioEasingInfo(current_volume, elapsed_time, &info);
- easing_info->volume = info.target_volume;
- easing_info->duration = info.duration;
- easing_info->type = static_cast<esplusplayer_audio_easing_type>(info.type);
-
- return convert_return_type_(ret);
-}
-
-int esplusplayer_start_audio_easing(esplusplayer_handle handle) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- auto ret = cast_(handle)->StartAudioEasing();
- return convert_return_type_(ret);
-}
-
-int esplusplayer_stop_audio_easing(esplusplayer_handle handle) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- auto ret = cast_(handle)->StopAudioEasing();
- return convert_return_type_(ret);
-}
-
-int get_size_of_esplusplayer_app_info(void) {
- return sizeof(esplusplayer_app_info);
-}
-
-int get_size_of_esplusplayer_es_packet(void) {
- return sizeof(esplusplayer_es_packet);
-}
-
-int get_size_of_esplusplayer_es_tz_packet(void) {
- return sizeof(esplusplayer_es_tz_packet);
-}
-
-int get_size_of_esplusplayer_audio_stream_info(void) {
- return sizeof(esplusplayer_audio_stream_info);
-}
-
-int get_size_of_esplusplayer_video_stream_info(void) {
- return sizeof(esplusplayer_video_stream_info);
-}
-
-int get_size_of_esplusplayer_drm_info(void) {
- return sizeof(esplusplayer_drm_info);
-}
-int esplusplayer_set_catch_up_speed(esplusplayer_handle handle,
- esplusplayer_catch_up_speed level) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- if (level < ESPLUSPLAYER_CATCH_UP_SPEED_NONE ||
- level > ESPLUSPLAYER_CATCH_UP_SPEED_FAST) {
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- }
- auto ret = cast_(handle)->SetCatchUpSpeed(static_cast<CatchUpSpeed>(level));
- return convert_return_type_(ret);
-}
-
-int esplusplayer_get_video_latency_status(esplusplayer_handle handle,
- esplusplayer_latency_status* status) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || is_null_(status))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- LatencyStatus current_status = LatencyStatus::kLow;
- auto ret = cast_(handle)->GetVideoLatencyStatus(¤t_status);
- *status = static_cast<esplusplayer_latency_status>(current_status);
-
- return convert_return_type_(ret);
-}
-
-int esplusplayer_get_audio_latency_status(esplusplayer_handle handle,
- esplusplayer_latency_status* status) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || is_null_(status))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- LatencyStatus current_status = LatencyStatus::kLow;
- auto ret = cast_(handle)->GetAudioLatencyStatus(¤t_status);
- *status = static_cast<esplusplayer_latency_status>(current_status);
-
- return convert_return_type_(ret);
-}
-
-int esplusplayer_set_video_mid_latency_threshold(esplusplayer_handle handle,
- const unsigned int threshold) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- auto ret = cast_(handle)->SetVideoMidLatencyThreshold(threshold);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_set_audio_mid_latency_threshold(esplusplayer_handle handle,
- const unsigned int threshold) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- auto ret = cast_(handle)->SetAudioMidLatencyThreshold(threshold);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_set_video_high_latency_threshold(
- esplusplayer_handle handle, const unsigned int threshold,
- esplusplayer_video_high_latency_cb video_high_latency_cb, void* userdata) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- esplusplayer_set_video_high_latency_cb(handle, video_high_latency_cb,
- userdata);
-
- auto ret = cast_(handle)->SetVideoHighLatencyThreshold(threshold);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_set_audio_high_latency_threshold(
- esplusplayer_handle handle, const unsigned int threshold,
- esplusplayer_audio_high_latency_cb audio_high_latency_cb, void* userdata) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- esplusplayer_set_audio_high_latency_cb(handle, audio_high_latency_cb,
- userdata);
-
- auto ret = cast_(handle)->SetAudioHighLatencyThreshold(threshold);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_get_virtual_rsc_id(esplusplayer_handle handle,
- const esplusplayer_rsc_type type,
- int* virtual_id) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle) || is_null_(virtual_id))
- return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- auto ret =
- cast_(handle)->GetVirtualRscId(static_cast<RscType>(type), virtual_id);
- return convert_return_type_(ret);
-}
-
-int esplusplayer_set_advanced_picture_quality_type(
- esplusplayer_handle handle,
- esplusplayer_advanced_picture_quality_type type) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
-
- auto ret = cast_(handle)->SetAdvancedPictureQualityType(
- static_cast<AdvPictureQualityType>(type));
- return convert_return_type_(ret);
-}
-
-int esplusplayer_set_resource_allocate_policy(
- esplusplayer_handle handle, esplusplayer_rsc_alloc_policy policy) {
- LOG_ENTER_P(cast_(handle))
- if (is_null_(handle)) return ESPLUSPLAYER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO("policy: %d", static_cast<int>(policy));
-
- auto ret = cast_(handle)->SetResourceAllocatePolicy(
- static_cast<RscAllocPolicy>(policy));
- return convert_return_type_(ret);
-}
+++ /dev/null
-PROJECT(mixer)
-
-SET(fw_name "${PROJECT_NAME}")
-SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
-SET(${fw_name}_LDFLAGS)
-
-SET(${fw_name}_CXXFLAGS "-Wall -Werror -std=c++11 -fPIC -Wl,-z,relro -fstack-protector")
-
-SET(dependents "dlog boost gstreamer-1.0 libtbm graphics-control")
-
-INCLUDE(FindPkgConfig)
-
-IF(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
-pkg_check_modules(${fw_name} REQUIRED ${dependents})
-ELSE(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
-pkg_check_modules(${fw_name} REQUIRED ${dependents})
-ENDIF(CMAKE_SYSTEM_PROCESSOR STREQUAL armv7l)
-
-FOREACH(flag ${${fw_name}_CFLAGS})
-SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
-ENDFOREACH(flag)
-
-FOREACH(flag ${${fw_name}_CXXFLAGS})
-SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS} ${flag}")
-ENDFOREACH(flag)
-
-GET_FILENAME_COMPONENT(PARENT_DIR ${PROJECT_SOURCE_DIR} DIRECTORY)
-INCLUDE_DIRECTORIES(
- ${PROJECT_SOURCE_DIR}/include_internal
- ${PARENT_DIR}/plusplayer-core/include_internal
-)
-
-SET(CC_SRCS
- ${PROJECT_SOURCE_DIR}/src/mixer_capi.cpp
- ${PROJECT_SOURCE_DIR}/src/mixer.cpp
- ${PROJECT_SOURCE_DIR}/src/defaultmixer.cpp
- ${PROJECT_SOURCE_DIR}/src/sys/tbminterface.cpp
- ${PROJECT_SOURCE_DIR}/src/tizen/tizenaccessiblebufferobj.cpp
- ${PROJECT_SOURCE_DIR}/src/tizen/tizenbufferkeyvideoframe.cpp
- ${PROJECT_SOURCE_DIR}/src/tizen/tizendefaultphyaddraccessor.cpp
- ${PROJECT_SOURCE_DIR}/src/tizen/tizenhwbufferobj.cpp
- ${PROJECT_SOURCE_DIR}/src/tizen/tizenhwvideoframe.cpp
- ${PROJECT_SOURCE_DIR}/src/tizen/tizenrenderableobj_factory.cpp
- ${PROJECT_SOURCE_DIR}/src/tizen/tizensurfacevideoframe.cpp
- ${PROJECT_SOURCE_DIR}/src/abs_videoframe.cpp
- ${PROJECT_SOURCE_DIR}/src/mixedframe.cpp
- ${PROJECT_SOURCE_DIR}/src/renderer.cpp
- ${PROJECT_SOURCE_DIR}/src/videoplane.cpp
-)
-
-ADD_LIBRARY(${fw_name} SHARED ${CC_SRCS})
-
-SET_TARGET_PROPERTIES(${fw_name} PROPERTIES LINKER_LANGUAGE CXX)
-
-TARGET_LINK_LIBRARIES(${fw_name} ${CMAKE_THREAD_LIBS_INIT} ${${fw_name}_LDFLAGS})
-
-INSTALL(TARGETS ${fw_name} DESTINATION ${LIB_INSTALL_DIR})
-INSTALL(
- DIRECTORY ${INC_DIR}/ DESTINATION include/
-)
+++ /dev/null
-#ifndef __PLUSPLAYER_ABSTRACT_MIXER_VIDEO_FRAME_H__
-#define __PLUSPLAYER_ABSTRACT_MIXER_VIDEO_FRAME_H__
-
-#include <memory>
-
-#include "mixer/interfaces/videoplanecollection.h"
-#include "mixer/interfaces/videoplanemanipulable.h"
-
-namespace plusplayer {
-
-class AbstractVideoFrame : public VideoPlaneCollection {
- public:
- using VideoPlaneManipulablePtr = std::unique_ptr<VideoPlaneManipulable>;
-
- public:
- explicit AbstractVideoFrame() = default;
- virtual ~AbstractVideoFrame() = default;
-
- public:
- virtual const std::vector<VideoPlaneManipulableInfo> GetVideoPlaneManipInfo()
- const override;
-
- bool IsValid() const;
- bool SetCropArea(const CropArea& croparea);
- const std::uint32_t GetWidth() const;
- const std::uint32_t GetHeight() const;
-
- protected:
- virtual bool IsValid_() const = 0;
- virtual const std::uint32_t GetWidth_() const = 0;
- virtual const std::uint32_t GetHeight_() const = 0;
-
- protected:
- void RegisterVideoPlaneManipulablePtr_(VideoPlaneManipulablePtr vpmanip);
-
- private:
- std::vector<VideoPlaneManipulablePtr> planes_;
-};
-} // namespace plusplayer
-
-#endif
\ No newline at end of file
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-
-#ifndef __PLUSPLAYER_SRC_PLAYER_DEFAULTMIXER__H__
-#define __PLUSPLAYER_SRC_PLAYER_DEFAULTMIXER__H__
-
-#include <trackrenderer_capi/trackrenderer_capi.h>
-
-#include <cassert>
-#include <chrono>
-#include <list>
-#include <map>
-#include <memory>
-#include <mutex>
-#include <thread>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/interfaces/videoplanecollection.h"
-#include "mixer/mixer.h"
-#include "mixer/mixerticket.h"
-#include "mixer/renderer.h"
-#include "mixer/tizen/tizenbuffermgr.h"
-
-namespace plusplayer {
-
-class DefaultMixer : public Mixer {
- public:
- using RendererPtr = std::unique_ptr<Renderer>;
-
- public:
- DefaultMixer();
- ~DefaultMixer();
-
- bool Start() override;
- bool Stop() override;
- int GetMaximumAllowedNumberOfPlayer() override;
- bool SetDisplay(const DisplayType type, void* obj) override;
- bool SetDisplay(const DisplayType type, const uint32_t surface_id,
- const int x, const int y, const int w, const int h) override;
- bool SetDisplayMode(const DisplayMode& mode) override;
- bool SetDisplayRoi(const Geometry& geometry) override;
- bool DisableAudioFocusSetting() override;
- bool SetAlternativeVideoScaler() override;
- bool SetAudioFocus(const void* player_instance) override;
- bool SetRscAllocMode(const RscAllocMode& mode) override;
- bool Commit() override;
- bool SetResolution(const ResolutionInfo& info) override;
- bool RegisterListener(MixerEventListener* listener) override;
- MixerTicket* CreateTicket(const void* player_instance) override;
-
- class Ticket : public MixerTicket {
- public:
- explicit Ticket(DefaultMixer* handler, const void* player_instance)
- : handler_(handler), player_instance_(player_instance) {
- assert(handler);
- }
- ~Ticket();
- bool GetAvailableResourceType(const ResourceCategory& category,
- ResourceType* type) override;
- bool Alloc(const ResourceCategory& category,
- const ResourceType& type) override;
- bool Render(const DecodedRawInfo& info) override;
- bool Render(const DecodedVideoKeyTypeInfo& info) override;
- bool RegisterListener(MixerTicketEventListener* listener) override;
- bool Prepare() override;
- bool IsAudioFocusHandler() override;
- bool IsRscAllocHandler() override;
-
- // interface for defaultmixer
- MixerTicketEventListener* GetListener();
- bool IsAudioFocused();
- void SetAudioFocus(bool active);
- void GetDisplayInfo(DisplayInfo* info);
- bool HasRenderedBefore();
- void UpdateDisplayInfo(const DisplayInfo& info);
- void DeallocResource();
- void RecordRenderingTime();
-
- private:
- DefaultMixer* handler_ = nullptr;
- const void* player_instance_ = nullptr;
- MixerTicketEventListener* ticket_listener_ = nullptr;
- bool is_audio_focus_ = false;
- DisplayInfo each_display_info_;
- bool has_rendered_ = false;
- std::chrono::system_clock::time_point last_rendering_time_;
- };
-
- private:
- struct Resource {
- ResourceCategory category = ResourceCategory::kVideoDecoder;
- ResourceType type = ResourceType::kHwMain;
- const void* assignee = nullptr;
- };
-
- class MixerRendererEventListener : public RendererEventListener {
- public:
- explicit MixerRendererEventListener(TrackRendererHandle* trhandle_ptr);
- virtual ~MixerRendererEventListener();
- virtual bool OnRenderingRelease(const BufferKeyType& key) override;
-
- private:
- void* CreateGstBuffer_(const BufferKeyType& key) const;
- void FillDecoderInputBuffer_(TrackRendererDecoderInputBuffer& buffer,
- const BufferKeyType& key) const;
-
- private:
- TrackRendererHandle* trhandle_ptr_;
- };
-
- private:
- bool Detach_(const void* player_instance);
- bool GetAvailableResourceType_();
- bool Render_(const void* player_instance,
- const VideoPlaneCollection& vplanes);
- bool RegisterListener_();
- void InitResourceList_();
- bool IsNeededToSkipRendering_(const DisplayInfo& display_info);
-
- using UserData = void*;
- static void ResourceConflictCb_(UserData userdata);
- static void ErrorCb_(const TrackRendererErrorType error_code,
- UserData userdata);
-
- private:
- std::map<const void*, Ticket*> player_map_;
- std::mutex mixer_lock_;
- std::mutex ticket_lock_;
- bool is_started_ = false;
- MixerEventListener* listener_ = nullptr;
- TrackRendererHandle trackrenderer_handle_ = nullptr;
- const void* audio_focused_player_ = nullptr;
- ResolutionInfo whole_resolution_;
- std::list<Resource> resource_list_;
- bool enable_audio_focus_setting_ = true;
- RscAllocMode resource_allocation_mode_ = RscAllocMode::kDefault;
- bool use_sub_scaler_ = false;
- RendererPtr renderer_;
- MixerRendererEventListener renderer_listener_;
- TizenBufferManager bufmgr_;
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_SRC_PLAYER_DEFAULTMIXER__H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_ACCESSIBLE_BUFFER_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_ACCESSIBLE_BUFFER_H__
-
-#include <memory>
-
-#include "mixer/interfaces/bufferobject.h"
-#include "mixer/interfaces/phyaddraccessor.h"
-
-namespace plusplayer {
-struct AccessibleBuffer {
- using PhyAddrAccessorPtr = std::unique_ptr<PhysicalAddressAccessor>;
-
- virtual ~AccessibleBuffer() = default;
- virtual PhyAddrAccessorPtr GetReadableAddress() const = 0;
- virtual PhyAddrAccessorPtr GetWritableAddress() const = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_ACCESSIBLE_BUFFER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_BUFFER_OBJECT_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_BUFFER_OBJECT_H__
-
-#include "mixer/types/buffertype.h"
-
-namespace plusplayer {
-struct BufferObject {
- virtual ~BufferObject() = default;
-
- virtual BufferHandleType GetBufferHandle() const = 0;
- virtual BufferKeyType Export() const = 0;
- virtual std::uint32_t GetSize() const = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_BUFFER_OBJECT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_MEMORY_OPERATOR_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_MEMORY_OPERATOR_H__
-
-#include <cstdint>
-#include <memory>
-
-#include "mixer/interfaces/bufferobject.h"
-#include "mixer/types/buffertype.h"
-
-namespace plusplayer {
-
-struct MemoryAllocator {
- virtual ~MemoryAllocator() = default;
- virtual BufferObject* Allocate(const std::uint32_t& size) const = 0;
-};
-} // namespace plusplayer
-#endif // __PLUSPLAYER_MIXER_INTERFACES_MEMORY_OPERATOR_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_PHYSICAL_ADDRESS_ACCESSOR_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_PHYSICAL_ADDRESS_ACCESSOR_H__
-
-#include "mixer/types/buffertype.h"
-
-namespace plusplayer {
-struct PhysicalAddressAccessor {
- virtual ~PhysicalAddressAccessor() = default;
- virtual BufferPhysicalAddrType GetAddress() = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_PHYSICAL_ADDRESS_ACCESSOR_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_RENDERABLE_OBJECT_FACTORY_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_RENDERABLE_OBJECT_FACTORY_H__
-
-#include "mixer/interfaces/renderableobject.h"
-
-namespace plusplayer {
-struct RenderableObjectFactory {
- virtual ~RenderableObjectFactory() = default;
- virtual RenderableObject* CreateRenderableObject(
- const std::uint32_t width, const std::uint32_t height) const = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_RENDERABLE_OBJECT_FACTORY_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_RENDERABLE_OBJECT_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_RENDERABLE_OBJECT_H__
-
-#include <cstdint>
-#include <memory>
-#include <vector>
-
-#include "mixer/interfaces/videoplanemanipulator.h"
-#include "mixer/types/buffertype.h"
-#include "mixer/types/planecomponent.h"
-#include "mixer/types/videoplanemanipinfo.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-struct RenderableObject {
- using Ptr = std::unique_ptr<RenderableObject>;
- virtual ~RenderableObject() = default;
- virtual bool IsValid() const = 0;
- virtual std::uint32_t GetWidth() const = 0;
- virtual std::uint32_t GetHeight() const = 0;
- virtual std::uint32_t GetSize() const = 0;
- virtual bool Render(const VideoPlaneManipulator* const vpmanip,
- const std::vector<VideoPlaneManipulableInfo>& planes,
- const Geometry& geom) = 0;
- virtual bool Fill(const VideoPlaneColorManipulator* const vpmanip,
- const PlaneComponent& comp, const std::uint32_t& color,
- const Geometry& geom) = 0;
- virtual bool Export(BufferKeyType& key) const = 0;
-};
-using RenderableObjectPtr = RenderableObject::Ptr;
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_RENDERABLE_OBJECT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COLLECTION_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COLLECTION_H__
-
-#include <vector>
-
-#include "mixer/types/videoplanemanipinfo.h"
-
-namespace plusplayer {
-struct VideoPlaneCollection {
- virtual ~VideoPlaneCollection() = default;
- virtual const std::vector<VideoPlaneManipulableInfo> GetVideoPlaneManipInfo()
- const = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COLLECTION_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COLOR_FILLER_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COLOR_FILLER_H__
-
-#include <memory>
-
-#include "mixer/interfaces/videoplanemanipulator.h"
-#include "mixer/types/planecomponent.h"
-
-namespace plusplayer {
-struct VideoPlaneColorFiller {
- virtual ~VideoPlaneColorFiller() = default;
- virtual const VideoPlaneColorManipulator* const GetColorFillManipulator()
- const = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COLOR_FILLER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COPIER_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COPIER_H__
-
-#include "mixer/interfaces/videoplanemanipulator.h"
-
-namespace plusplayer {
-struct VideoPlaneCopier {
- virtual ~VideoPlaneCopier() = default;
- virtual const VideoPlaneManipulator* const GetCopyManipulator() const = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_COPIER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_MANIPULABLE_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_MANIPULABLE_H__
-
-#include "mixer/types/videoplanemanipinfo.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-
-struct VideoPlaneManipulable {
- virtual ~VideoPlaneManipulable() = default;
- virtual bool IsValid() const = 0;
- virtual VideoPlaneManipulableInfo GetVideoPlaneManipulableInfo() const = 0;
- virtual void SetCropArea(const CropArea& croparea) = 0;
-};
-
-} // namespace plusplayer
-
-#endif //__PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_MANIPULABLE_H__
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_MANIPULATOR_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_MANIPULATOR_H__
-
-#include <cstdint>
-
-#include "mixer/types/planecomponent.h"
-#include "mixer/types/videoplanemanipinfo.h"
-
-namespace plusplayer {
-
-template <typename T>
-struct VideoPlaneManipulatorWithType {
- virtual bool Do(const T&, const VideoPlaneManipulableInfo&) const = 0;
-};
-
-using VideoPlaneManipulator =
- VideoPlaneManipulatorWithType<VideoPlaneManipulableInfo>;
-
-using VideoPlaneColorManipulator = VideoPlaneManipulatorWithType<std::uint32_t>;
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_MANIPULATOR_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_SCALER_H__
-#define __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_SCALER_H__
-
-#include "mixer/interfaces/videoplanemanipulator.h"
-
-namespace plusplayer {
-struct VideoPlaneScaler {
- virtual ~VideoPlaneScaler() = default;
- virtual const VideoPlaneManipulator* const GetScaleManipulator() const = 0;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_INTERFACES_VIDEO_PLANE_SCALER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_MIXED_FRAME_H__
-#define __PLUSPLAYER_MIXER_MIXED_FRAME_H__
-
-#include <cstdint>
-#include <memory>
-
-#include "mixer/interfaces/memoryallocator.h"
-#include "mixer/interfaces/renderableobject.h"
-#include "mixer/interfaces/videoplanecollection.h"
-#include "mixer/interfaces/videoplanemanipulator.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-class MixedFrame : public VideoPlaneCollection, public RenderableObject {
- public:
- using Ptr = std::unique_ptr<MixedFrame>;
- using BufferObjectPtr = std::unique_ptr<BufferObject>;
-
- public:
- static Ptr Create(const MemoryAllocator* const memop,
- const std::uint32_t width, const std::uint32_t height);
-
- public:
- explicit MixedFrame(const MemoryAllocator* const memop,
- const std::uint32_t width, const std::uint32_t height);
- virtual ~MixedFrame() = default;
-
- public:
- virtual const std::vector<VideoPlaneManipulableInfo> GetVideoPlaneManipInfo()
- const override;
-
- public:
- virtual bool IsValid() const override;
- virtual std::uint32_t GetWidth() const override;
- virtual std::uint32_t GetHeight() const override;
- virtual std::uint32_t GetSize() const override;
- virtual bool Render(const VideoPlaneManipulator* const vpmanip,
- const std::vector<VideoPlaneManipulableInfo>& planes,
- const Geometry& geom) override;
- virtual bool Fill(const VideoPlaneColorManipulator* const vpmanip,
- const PlaneComponent& comp, const std::uint32_t& color,
- const Geometry& geom) override;
- virtual bool Export(BufferKeyType& key) const override;
-
- private:
- std::uint32_t CalculateBufferSize_(const std::uint32_t width,
- const std::uint32_t height);
- VideoPlaneManipulableInfo GetMixedFrameVideoPlaneManipulableInfo_(
- const PlaneComponent component, const Geometry& geom);
- VideoPlaneManipulableInfo GetYComponentVMInfo_(BufferHandleType handle) const;
- VideoPlaneManipulableInfo GetUVComponentVMInfo_(
- BufferHandleType handle) const;
-
- private:
- const std::uint32_t width_ = 0;
- const std::uint32_t height_ = 0;
- mutable std::uint32_t allocated_size_ = 0;
- BufferObjectPtr buffer_ = nullptr;
-};
-using MixedFramePtr = MixedFrame::Ptr;
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_MIXED_FRAME_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_RENDERER_H__
-#define __PLUSPLAYER_MIXER_RENDERER_H__
-
-#include <chrono>
-#include <condition_variable>
-#include <memory>
-#include <mutex>
-#include <thread>
-#include <vector>
-
-#include "mixer/interfaces/renderableobj_factory.h"
-#include "mixer/interfaces/videoplanecollection.h"
-#include "mixer/interfaces/videoplanecolorfiller.h"
-#include "mixer/interfaces/videoplanescaler.h"
-#include "mixer/mixer.h"
-#include "mixer/types/buffertype.h"
-#include "mixer/types/videoplanemoveinfo.h"
-
-namespace plusplayer {
-
-struct RendererEventListener {
- virtual bool OnRenderingRelease(const BufferKeyType&) = 0;
-};
-
-class Renderer {
- private:
- using JitterType = std::chrono::duration<std::int64_t, std::milli>;
-
- public:
- explicit Renderer(const RenderableObjectFactory& mf_factory,
- const Mixer::ResolutionInfo& rinfo,
- RendererEventListener* listener);
- virtual ~Renderer();
-
- public:
- bool IsValid() const;
- bool Start();
- bool Stop();
- bool ChangeResolution(const RenderableObjectFactory& mf_factory,
- const std::uint32_t& width,
- const std::uint32_t& height);
- bool ChangeRenderingSpeed(const std::uint32_t framerate_num,
- const std::uint32_t framerate_den);
-
- bool Render(const VideoPlaneScaler* const scaler,
- const VideoPlaneCollection* const planes, const Geometry& geom);
- bool Mute(const VideoPlaneColorFiller* const filler, const Geometry& geom);
- bool Move(const VideoPlaneColorFiller* const filler,
- const std::vector<VideoPlaneMoveInfo>& moving_planes);
-
- protected:
- virtual bool ChangeResolutionInternal_(
- const RenderableObjectFactory& mf_factory, const std::uint32_t& width,
- const std::uint32_t& height);
- virtual bool RenderInternal_(
- const VideoPlaneManipulator* const vpmanip,
- const std::vector<VideoPlaneManipulableInfo>& planes,
- const Geometry& geom);
- virtual bool MuteInternal_(const VideoPlaneColorManipulator* const filler,
- const Geometry& geom);
- virtual bool MoveInternal_(
- const VideoPlaneColorManipulator* const filler,
- const std::vector<VideoPlaneMoveInfo>& moving_planes);
- virtual bool OnRenderingBefore_(const RenderableObject* const frame);
- virtual bool IsValid_() const;
-
- std::uint32_t GetNextRenderingTimeWithJitter_(const JitterType& jitter) const;
- const Mixer::ResolutionInfo& GetResolutionInfo_() const;
- RenderableObjectPtr& GetMixedFrame_();
- void AcquireRenderingLock_();
- void ReleaseRenderingLock_();
-
- private:
- bool RaiseOnRenderingReleaseEvent_(const BufferKeyType& key);
- void RenderingWorker_();
-
- protected:
- static Geometry MakeGeometry_(const std::uint32_t& width,
- const std::uint32_t& height);
- static bool IsSameGeometry_(const Geometry& g1, const Geometry& g2);
-
- private:
- Mixer::ResolutionInfo resolution_info_;
- RendererEventListener* listener_ = nullptr;
- RenderableObjectPtr frame_ = nullptr;
-
- bool rendering_flag_ = false;
- std::mutex rendering_mtx_;
- std::condition_variable rendering_cv_;
- std::thread rendering_worker_;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_RENDERER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_RENDERER_WITH_DOUBLE_BUFFERING_H__
-#define __PLUSPLAYER_MIXER_RENDERER_WITH_DOUBLE_BUFFERING_H__
-
-#include <boost/scope_exit.hpp>
-#include <chrono>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/interfaces/videoplanecopier.h"
-#include "mixer/interfaces/videoplanescaler.h"
-#include "mixer/mixedframe.h"
-#include "mixer/renderer.h"
-
-namespace plusplayer {
-
-class RendererWithDoubleBuffer : public Renderer {
- public:
- explicit RendererWithDoubleBuffer(const RenderableObjectFactory& mf_factory,
- const VideoPlaneCopier* const vpcopier,
- const VideoPlaneScaler* const vpscaler,
- const Mixer::ResolutionInfo& rinfo,
- RendererEventListener* listener)
- : Renderer(mf_factory, rinfo, listener),
- frame_(MixedFramePtr(dynamic_cast<MixedFrame*>(
- mf_factory.CreateRenderableObject(rinfo.width, rinfo.height)))),
- vpcopier_(vpcopier),
- vpscaler_(vpscaler) {}
- virtual ~RendererWithDoubleBuffer() = default;
-
- protected:
- virtual bool OnRenderingBefore_(
- const RenderableObject* const frame) override {
- // auto before = std::chrono::system_clock::now();
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- // LOG_INFO("[PERF] OnRenderingBefore_ Lock [%llu]ms",
- // std::chrono::duration_cast<std::chrono::milliseconds>(
- // std::chrono::system_clock::now() - before)
- // .count());
- const auto& rinfo = GetResolutionInfo_();
- auto ret = GetMixedFrame_()->Render(
- vpcopier_->GetCopyManipulator(), frame_->GetVideoPlaneManipInfo(),
- MakeGeometry_(rinfo.width, rinfo.height));
- // LOG_INFO("[PERF] Copy [%llu]ms",
- // std::chrono::duration_cast<std::chrono::milliseconds>(
- // std::chrono::system_clock::now() - before)
- // .count());
- return ret;
- }
-
- virtual bool ChangeResolutionInternal_(
- const RenderableObjectFactory& mf_factory, const std::uint32_t& width,
- const std::uint32_t& height) override {
- {
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- frame_.reset(nullptr);
- frame_ = MixedFramePtr(dynamic_cast<MixedFrame*>(
- mf_factory.CreateRenderableObject(width, height)));
- }
- return Renderer::ChangeResolutionInternal_(mf_factory, width, height);
- }
-
- virtual bool RenderInternal_(
- const VideoPlaneManipulator* const scaler,
- const std::vector<VideoPlaneManipulableInfo>& planes,
- const Geometry& geom) override {
- if (scaler == nullptr) return false;
- auto before = std::chrono::system_clock::now();
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- auto ret = frame_->Render(scaler, planes, geom);
- LOG_INFO("[PERF] Scale [%llu]ms",
- std::chrono::duration_cast<std::chrono::milliseconds>(
- std::chrono::system_clock::now() - before)
- .count());
- return ret;
- }
-
- virtual bool MuteInternal_(const VideoPlaneColorManipulator* const filler,
- const Geometry& geom) override {
- if (filler == nullptr) return false;
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- bool ret = true;
- LOG_INFO("MUTE REGION (%d, %d, %d x %d)", geom.x, geom.y, geom.w, geom.h);
- ret &= frame_->Fill(filler, PlaneComponent::kYComponent, 0x00, geom);
- ret &= frame_->Fill(filler, PlaneComponent::kUVComponent, 0x8080, geom);
- return ret;
- }
-
- virtual bool MoveInternal_(
- const VideoPlaneColorManipulator* const filler,
- const std::vector<VideoPlaneMoveInfo>& moving_planes) override {
- if (filler == nullptr) return false;
-
- AcquireRenderingLock_();
- BOOST_SCOPE_EXIT(this_) { this_->ReleaseRenderingLock_(); }
- BOOST_SCOPE_EXIT_END
-
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
-
- auto* mixedframe = dynamic_cast<MixedFrame*>(GetMixedFrame_().get());
- if (mixedframe == nullptr) return false;
-
- const auto planes = mixedframe->GetVideoPlaneManipInfo();
- if (planes.size() != 2) return false;
-
- const auto& rinfo = GetResolutionInfo_();
-
- auto fullgeom = MakeGeometry_(rinfo.width, rinfo.height);
- bool ret = true;
- ret &= frame_->Fill(filler, PlaneComponent::kYComponent, 0x00, fullgeom);
- ret &= frame_->Fill(filler, PlaneComponent::kUVComponent, 0x8080, fullgeom);
- auto* scaler = vpscaler_->GetScaleManipulator();
- for (const auto& move : moving_planes) {
- VideoPlaneManipulableInfo y_manipinfo = planes[0];
- VideoPlaneManipulableInfo uv_manipinfo = planes[1];
- y_manipinfo.rect = move.cur;
- uv_manipinfo.rect = move.cur;
- uv_manipinfo.rect.x /= 2;
- uv_manipinfo.rect.y /= 2;
- uv_manipinfo.rect.w /= 2;
- uv_manipinfo.rect.h /= 2;
- uv_manipinfo.rect.y += rinfo.height;
- LOG_INFO("MOVE (%d, %d, %d x %d) -> (%d, %d, %d x %d)", move.cur.x,
- move.cur.y, move.cur.w, move.cur.h, move.target.x, move.target.y,
- move.target.w, move.target.h);
- ret &= frame_->Render(scaler, {y_manipinfo, uv_manipinfo}, move.target);
- }
- return true;
- };
-
- virtual bool IsValid_() const override {
- if (frame_ == nullptr) return false;
- if (frame_->IsValid() == false) return false;
- if (vpcopier_ == nullptr || vpscaler_ == nullptr) return false;
- if (vpcopier_->GetCopyManipulator() == nullptr) return false;
- if (vpscaler_->GetScaleManipulator() == nullptr) return false;
- return true;
- }
-
- private:
- MixedFramePtr frame_ = nullptr;
- const VideoPlaneCopier* const vpcopier_ = nullptr;
- const VideoPlaneScaler* const vpscaler_ = nullptr;
-
- std::mutex rendering_mtx_;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_RENDERER_WITH_DOUBLE_BUFFERING_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_SYS_TBM_INTERFACE_H__
-#define __PLUSPLAYER_MIXER_SYS_TBM_INTERFACE_H__
-
-#include <capi-graphics-control.h>
-
-#include "mixer/types/buffertype.h"
-
-namespace plusplayer {
-namespace tizen {
-class TBMInterface {
- public:
- static BufferDefaultType BoRef(BufferDefaultType bo);
- static void BoUnRef(BufferDefaultType bo);
- static int BoSize(BufferDefaultType bo);
- static BufferUnionHandleType BoGetHandle(BufferDefaultType bo, int device);
- static BufferUnionHandleType BoMap(BufferDefaultType bo, int device,
- int option);
- static void BoUnmap(BufferDefaultType bo);
- static BufferKeyType BoExport(BufferDefaultType bo);
- static BufferDefaultType BoAlloc(tbm_bufmgr bufmgr, int size, int flag);
- static BufferDefaultType BoImport(tbm_bufmgr bufmgr, BufferKeyType key);
- static int GAScale(tbm_bufmgr bufmgr, GraphicsGAScaleInfo* info);
- static int GACopy(tbm_bufmgr bufmgr, GraphicsGABltRopInfo* info);
- static int GAFill(tbm_bufmgr bufmgr, GraphicsGAFillRectInfo* info);
-};
-} // namespace tizen
-} // namespace plusplayer
-
-#endif //__PLUSPLAYER_MIXER_SYS_TBM_INTERFACE_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_TIZEN_ACCESSIBLE_BUFFER_OBJECT_H__
-#define __PLUSPLAYER_MIXER_TIZEN_TIZEN_ACCESSIBLE_BUFFER_OBJECT_H__
-
-#include "mixer/interfaces/accessiblebuffer.h"
-#include "mixer/tizen/tizenbufferobj.h"
-#include "mixer/tizen/tizenbufferphyaddraccessor.h"
-
-namespace plusplayer {
-class TizenAccessibleBufferObject : public TizenBufferObject,
- public AccessibleBuffer {
- public:
- explicit TizenAccessibleBufferObject(BufferDefaultType buffer);
- virtual ~TizenAccessibleBufferObject() = default;
- virtual PhyAddrAccessorPtr GetReadableAddress() const override;
- virtual PhyAddrAccessorPtr GetWritableAddress() const override;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_TIZEN_ACCESSIBLE_BUFFER_OBJECT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_BUFFER_KEY_VIDEO_SURFACE_H__
-#define __PLUSPLAYER_MIXER_TIZEN_BUFFER_KEY_VIDEO_SURFACE_H__
-
-#include <memory>
-
-#include "mixer/abs_videoframe.h"
-#include "mixer/interfaces/bufferobject.h"
-#include "mixer/tizen/tizenbuffermgr.h"
-#include "mixer/videoplane.h"
-
-namespace plusplayer {
-
-class TizenBufferKeyVideoFrame : public AbstractVideoFrame {
- public:
- using BufferObjectPtr = std::shared_ptr<BufferObject>;
-
- public:
- explicit TizenBufferKeyVideoFrame(const TizenBufferManager* const bufmgr,
- const BufferKeyType& key,
- const std::uint32_t& width,
- const std::uint32_t& height);
- virtual ~TizenBufferKeyVideoFrame() = default;
-
- protected:
- virtual bool IsValid_() const override;
- virtual const std::uint32_t GetWidth_() const override;
- virtual const std::uint32_t GetHeight_() const override;
-
- private:
- const BufferKeyType key_;
- const std::uint32_t width_;
- const std::uint32_t height_;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_BUFFER_KEY_VIDEO_SURFACE_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_BUFFER_MANAGER_H__
-#define __PLUSPLAYER_MIXER_TIZEN_BUFFER_MANAGER_H__
-
-#include <cstring>
-
-#include "mixer/interfaces/memoryallocator.h"
-#include "mixer/interfaces/videoplanecolorfiller.h"
-#include "mixer/interfaces/videoplanecopier.h"
-#include "mixer/interfaces/videoplanemanipulator.h"
-#include "mixer/interfaces/videoplanescaler.h"
-#include "mixer/sys/tbminterface.h"
-#include "mixer/tizen/tizenaccessiblebufferobj.h"
-#include "mixer/types/videoplanemanipinfo.h"
-
-namespace {
-struct GlobalInstance {
- tbm_bufmgr bufmgr;
- GlobalInstance() { bufmgr = tbm_bufmgr_init(-1); }
- ~GlobalInstance() {
- if (bufmgr) tbm_bufmgr_deinit(bufmgr);
- }
-};
-static const GlobalInstance kGlobalInstance;
-} // namespace
-
-namespace plusplayer {
-template <typename TBM>
-class BufferManagerWithType : public MemoryAllocator,
- public VideoPlaneScaler,
- public VideoPlaneCopier,
- public VideoPlaneColorFiller {
- public:
- class Scaler : public VideoPlaneManipulator {
- public:
- explicit Scaler(const BufferManagerWithType* const bufmgr);
- virtual ~Scaler() = default;
- virtual bool Do(const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dest) const override;
-
- private:
- const BufferManagerWithType* const bufmgr_;
- };
- class Copier : public VideoPlaneManipulator {
- public:
- explicit Copier(const BufferManagerWithType* const bufmgr);
- virtual ~Copier() = default;
- virtual bool Do(const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dest) const override;
-
- private:
- const BufferManagerWithType* const bufmgr_;
- };
- class ColorFiller : public VideoPlaneColorManipulator {
- public:
- explicit ColorFiller(const BufferManagerWithType* const bufmgr);
- virtual ~ColorFiller() = default;
- virtual bool Do(const std::uint32_t& color,
- const VideoPlaneManipulableInfo& dest) const override;
-
- private:
- const BufferManagerWithType* const bufmgr_;
- };
-
- public:
- explicit BufferManagerWithType();
- virtual ~BufferManagerWithType() = default;
-
- public:
- virtual BufferObject* Allocate(const std::uint32_t& size) const override;
- virtual const VideoPlaneManipulator* const GetScaleManipulator()
- const override;
- virtual const VideoPlaneManipulator* const GetCopyManipulator()
- const override;
- virtual const VideoPlaneColorManipulator* const GetColorFillManipulator()
- const override;
- bool IsValid() const;
- BufferObject* Import(BufferHandleType handle) const;
-
- protected:
- bool Copy_(const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dst) const;
- bool Scale_(const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dst) const;
- bool Fill_(const std::uint32_t color,
- const VideoPlaneManipulableInfo& dst) const;
-
- private:
- tbm_bufmgr bufmgr_;
- Scaler scaler_;
- Copier copier_;
- ColorFiller color_filler_;
-};
-
-using TizenBufferManager = BufferManagerWithType<tizen::TBMInterface>;
-
-/******************************************************************************
- * Body
- */
-template <typename TBM>
-BufferManagerWithType<TBM>::BufferManagerWithType()
- : scaler_(this), copier_(this), color_filler_(this) {
- bufmgr_ = ::kGlobalInstance.bufmgr;
-}
-
-template <typename TBM>
-BufferObject* BufferManagerWithType<TBM>::Allocate(
- const std::uint32_t& size) const {
- if (size == 0) return nullptr;
- if (IsValid() == false) return nullptr;
- auto buffer = TBM::BoAlloc(bufmgr_, size, TBM_BO_SCANOUT | (1 << 17));
- if (buffer == nullptr) return nullptr;
- auto bufferobj = new TizenAccessibleBufferObject(buffer);
- TBM::BoUnRef(buffer);
- return bufferobj;
-}
-
-template <typename TBM>
-const VideoPlaneManipulator* const
-BufferManagerWithType<TBM>::GetScaleManipulator() const {
- return &scaler_;
-}
-
-template <typename TBM>
-const VideoPlaneManipulator* const
-BufferManagerWithType<TBM>::GetCopyManipulator() const {
- return &copier_;
-}
-
-template <typename TBM>
-const VideoPlaneColorManipulator* const
-BufferManagerWithType<TBM>::GetColorFillManipulator() const {
- return &color_filler_;
-}
-
-template <typename TBM>
-bool BufferManagerWithType<TBM>::IsValid() const {
- if (bufmgr_ == nullptr) return false;
- return true;
-}
-
-template <typename TBM>
-BufferObject* BufferManagerWithType<TBM>::Import(
- BufferHandleType handle) const {
- if (IsValid() == false) return nullptr;
- auto buffer = TBM::BoImport(bufmgr_, handle);
- if (buffer == nullptr) return nullptr;
- auto bufferobj = new TizenBufferObject(buffer);
- TBM::BoUnRef(buffer);
- return bufferobj;
-}
-
-template <typename TBM>
-bool BufferManagerWithType<TBM>::Copy_(
- const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dst) const {
- if (src.component != dst.component) return false;
- if (IsValid() == false) return false;
- GraphicsGABltRopInfo info;
- std::memset(&info, 0, sizeof(GraphicsGABltRopInfo));
- info.ga_mode = GRAPHICS_GA_BITBLT_MODE_NORMAL;
- info.rop_mode = GRAPHICS_GA_ROP_COPY;
- info.ga_op_type = GRAPHICS_GA_COPY;
- info.pre_alphamode = 0;
- info.ca_value = 0;
- info.color_format =
- (src.component == PlaneComponent::kYComponent ? GRAPHICS_GA_FORMAT_8BPP
- : GRAPHICS_GA_FORMAT_16BPP);
-
- info.src_handle = src.handle;
- info.src_hbytesize = src.linesize;
- info.src_rect.x = src.rect.x;
- info.src_rect.y = src.rect.y;
- info.src_rect.w = src.rect.w;
- info.src_rect.h = src.rect.h;
-
- info.dst_handle = dst.handle;
- info.dst_hbytesize = dst.linesize;
- info.dst_rect.x = dst.rect.x;
- info.dst_rect.y = dst.rect.y;
- info.dst_rect.w = dst.rect.w;
- info.dst_rect.h = dst.rect.h;
-
- return TBM::GACopy(bufmgr_, &info) > 0;
-}
-
-template <typename TBM>
-bool BufferManagerWithType<TBM>::Scale_(
- const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dst) const {
- if (src.component != dst.component) return false;
- if (IsValid() == false) return false;
- GraphicsGAScaleInfo info;
- std::memset(&info, 0, sizeof(GraphicsGAScaleInfo));
- info.ga_mode = GRAPHICS_GA_SCALE_MODE;
- info.rop_mode = GRAPHICS_GA_ROP_COPY;
- info.ga_op_type = GRAPHICS_GA_SCALE;
- info.pre_alphamode = 0;
- info.ca_value = 0;
- info.rop_on_off = 0;
- info.color_format =
- (src.component == PlaneComponent::kYComponent ? GRAPHICS_GA_FORMAT_8BPP
- : GRAPHICS_GA_FORMAT_16BPP);
-
- info.src_handle = src.handle;
- info.src_hbytesize = src.linesize;
- info.src_rect.x = src.rect.x;
- info.src_rect.y = src.rect.y;
- info.src_rect.w = src.rect.w;
- info.src_rect.h = src.rect.h;
-
- info.dst_handle = dst.handle;
- info.dst_hbytesize = dst.linesize;
- info.dst_rect.x = dst.rect.x;
- info.dst_rect.y = dst.rect.y;
- info.dst_rect.w = dst.rect.w;
- info.dst_rect.h = dst.rect.h;
-
- return TBM::GAScale(bufmgr_, &info) > 0;
-}
-
-template <typename TBM>
-bool BufferManagerWithType<TBM>::Fill_(
- const std::uint32_t color, const VideoPlaneManipulableInfo& dst) const {
- if (IsValid() == false) return false;
- GraphicsGAFillRectInfo info;
- std::memset(&info, 0, sizeof(GraphicsGAFillRectInfo));
- info.color_format =
- (dst.component == PlaneComponent::kYComponent ? GRAPHICS_GA_FORMAT_8BPP
- : GRAPHICS_GA_FORMAT_16BPP);
- info.ga_op_type = GRAPHICS_GA_SOLID_FILL;
- info.color = color;
-
- info.handle = dst.handle;
- info.hbytesize = dst.linesize;
- info.rect.x = dst.rect.x;
- info.rect.y = dst.rect.y;
- info.rect.w = dst.rect.w;
- info.rect.h = dst.rect.h;
-
- return TBM::GAFill(bufmgr_, &info) > 0;
-}
-
-/******************************************************************************
- * Body for scaler
- */
-template <typename TBM>
-BufferManagerWithType<TBM>::Scaler::Scaler(
- const BufferManagerWithType* const bufmgr)
- : bufmgr_(bufmgr) {}
-
-template <typename TBM>
-bool BufferManagerWithType<TBM>::Scaler::Do(
- const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dest) const {
- return bufmgr_->Scale_(src, dest);
-}
-
-/******************************************************************************
- * Body for copier
- */
-template <typename TBM>
-BufferManagerWithType<TBM>::Copier::Copier(
- const BufferManagerWithType* const bufmgr)
- : bufmgr_(bufmgr) {}
-
-template <typename TBM>
-bool BufferManagerWithType<TBM>::Copier::Do(
- const VideoPlaneManipulableInfo& src,
- const VideoPlaneManipulableInfo& dest) const {
- return bufmgr_->Copy_(src, dest);
-}
-
-/******************************************************************************
- * Body for color filler
- */
-template <typename TBM>
-BufferManagerWithType<TBM>::ColorFiller::ColorFiller(
- const BufferManagerWithType* const bufmgr)
- : bufmgr_(bufmgr) {}
-
-template <typename TBM>
-bool BufferManagerWithType<TBM>::ColorFiller::Do(
- const std::uint32_t& color, const VideoPlaneManipulableInfo& dest) const {
- return bufmgr_->Fill_(color, dest);
-}
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_BUFFER_MANAGER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_TIZEN_BUFFER_OBJECT_H__
-#define __PLUSPLAYER_MIXER_TIZEN_TIZEN_BUFFER_OBJECT_H__
-
-#include "mixer/interfaces/bufferobject.h"
-#include "mixer/sys/tbminterface.h"
-
-namespace plusplayer {
-template <typename TBM>
-class BufferObjectWithType : public BufferObject {
- public:
- explicit BufferObjectWithType(BufferDefaultType buffer);
- virtual ~BufferObjectWithType();
- bool IsValid() const;
- virtual BufferHandleType GetBufferHandle() const override;
- virtual BufferKeyType Export() const override;
- virtual std::uint32_t GetSize() const override;
-
- protected:
- const BufferDefaultType& GetBuffer_() const;
-
- private:
- BufferDefaultType buffer_ = nullptr;
-};
-
-using TizenBufferObject = BufferObjectWithType<plusplayer::tizen::TBMInterface>;
-
-/******************************************************************************
- * Body
- */
-template <typename TBM>
-BufferObjectWithType<TBM>::BufferObjectWithType(BufferDefaultType buffer) {
- if (buffer == nullptr) return;
- buffer_ = TBM::BoRef(buffer);
-}
-
-template <typename TBM>
-BufferObjectWithType<TBM>::~BufferObjectWithType() {
- if (buffer_) TBM::BoUnRef(buffer_);
-}
-
-template <typename TBM>
-bool BufferObjectWithType<TBM>::IsValid() const {
- if (buffer_ == nullptr) return false;
- return true;
-}
-
-template <typename TBM>
-BufferHandleType BufferObjectWithType<TBM>::GetBufferHandle() const {
- if (IsValid() == false) return kInvalidBufferHandle;
- auto handle = TBM::BoGetHandle(buffer_, TBM_DEVICE_2D);
- return handle.u32;
-}
-
-template <typename TBM>
-BufferKeyType BufferObjectWithType<TBM>::Export() const {
- if (IsValid() == false) return kInvalidBufferKey;
- return TBM::BoExport(buffer_);
-}
-
-template <typename TBM>
-std::uint32_t BufferObjectWithType<TBM>::GetSize() const {
- if (IsValid() == false) return kInvalidBufferSize;
- return TBM::BoSize(buffer_);
-}
-
-template <typename TBM>
-const BufferDefaultType& BufferObjectWithType<TBM>::GetBuffer_() const {
- return buffer_;
-}
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_TIZEN_BUFFER_OBJECT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_BUFFER_PHYSICAL_ADDRESS_ACCESOR_H__
-#define __PLUSPLAYER_MIXER_TIZEN_BUFFER_PHYSICAL_ADDRESS_ACCESOR_H__
-
-#include <tbm_bo.h>
-
-#include "mixer/interfaces/phyaddraccessor.h"
-
-namespace plusplayer {
-class AbstractTizenBufferPhyAddrAccessor : public PhysicalAddressAccessor {
- public:
- explicit AbstractTizenBufferPhyAddrAccessor(BufferDefaultType buffer) {
- if (buffer == nullptr) return;
- buffer_ = tbm_bo_ref(buffer);
- }
-
- virtual ~AbstractTizenBufferPhyAddrAccessor() {
- if (buffer_ == nullptr) return;
- if (handle_ != nullptr) tbm_bo_unmap(buffer_);
- tbm_bo_unref(buffer_);
- }
-
- public:
- virtual BufferPhysicalAddrType GetAddress() override {
- if (handle_ != nullptr) return handle_;
- handle_ = GetAddress_(buffer_);
- return handle_;
- }
-
- protected:
- virtual BufferPhysicalAddrType GetAddress_(
- const BufferDefaultType& buffer) = 0;
-
- private:
- BufferDefaultType buffer_;
- BufferPhysicalAddrType handle_ = nullptr;
-};
-
-class TizenReadableBufferPhyAddrAccessor
- : public AbstractTizenBufferPhyAddrAccessor {
- public:
- explicit TizenReadableBufferPhyAddrAccessor(const BufferDefaultType buffer)
- : AbstractTizenBufferPhyAddrAccessor(buffer) {}
- virtual ~TizenReadableBufferPhyAddrAccessor() = default;
-
- protected:
- virtual BufferPhysicalAddrType GetAddress_(
- const BufferDefaultType& buffer) override {
- auto handle = tbm_bo_map(buffer, TBM_DEVICE_CPU, TBM_OPTION_READ);
- return handle.ptr;
- }
-};
-
-class TizenWritableBufferPhyAddrAccessor
- : public AbstractTizenBufferPhyAddrAccessor {
- public:
- explicit TizenWritableBufferPhyAddrAccessor(BufferDefaultType buffer)
- : AbstractTizenBufferPhyAddrAccessor(buffer) {}
- virtual ~TizenWritableBufferPhyAddrAccessor() = default;
-
- protected:
- virtual BufferPhysicalAddrType GetAddress_(
- const BufferDefaultType& buffer) override {
- auto handle = tbm_bo_map(buffer, TBM_DEVICE_CPU, TBM_OPTION_WRITE);
- return handle.ptr;
- }
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_BUFFER_PHYSICAL_ADDRESS_ACCESOR_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_DEFAULT_PHYSICAL_ADDRESS_ACCESOR_H__
-#define __PLUSPLAYER_MIXER_TIZEN_DEFAULT_PHYSICAL_ADDRESS_ACCESOR_H__
-
-#include "mixer/interfaces/phyaddraccessor.h"
-
-namespace plusplayer {
-class TizenDefaultPhyAddrAccessor : public PhysicalAddressAccessor {
- public:
- explicit TizenDefaultPhyAddrAccessor(std::uint32_t viraddr);
- virtual ~TizenDefaultPhyAddrAccessor() = default;
-
- public:
- virtual BufferPhysicalAddrType GetAddress() override;
-
- private:
- std::uint32_t viraddr_;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_DEFAULT_PHYSICAL_ADDRESS_ACCESOR_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_TIZEN_HW_BUFFER_OBJECT_H__
-#define __PLUSPLAYER_MIXER_TIZEN_TIZEN_HW_BUFFER_OBJECT_H__
-
-#include "mixer/decodedvideoinfo.h"
-#include "mixer/interfaces/bufferobject.h"
-
-namespace plusplayer {
-class TizenHWBufferObject : public BufferObject {
- public:
- explicit TizenHWBufferObject(const std::uint32_t& width,
- const std::uint32_t& height,
- const DecodedRawPlaneInfo& info);
- virtual ~TizenHWBufferObject() = default;
-
- bool IsValid() const;
- virtual BufferHandleType GetBufferHandle() const override;
- virtual BufferKeyType Export() const override;
- virtual std::uint32_t GetSize() const override;
-
- private:
- std::uint32_t width_;
- std::uint32_t height_;
- DecodedRawPlaneInfo info_;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_TIZEN_HW_BUFFER_OBJECT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_HW_VIDEO_FRAME_H__
-#define __PLUSPLAYER_MIXER_TIZEN_HW_VIDEO_FRAME_H__
-
-#include <memory>
-
-#include "mixer/abs_videoframe.h"
-#include "mixer/decodedvideoinfo.h"
-#include "mixer/interfaces/bufferobject.h"
-
-namespace plusplayer {
-class TizenHWVideoFrame : public AbstractVideoFrame {
- public:
- using BufferObjectPtr = std::unique_ptr<BufferObject>;
-
- public:
- explicit TizenHWVideoFrame(const DecodedRawInfo& info);
- virtual ~TizenHWVideoFrame() = default;
-
- protected:
- virtual bool IsValid_() const override;
- virtual const std::uint32_t GetWidth_() const override;
- virtual const std::uint32_t GetHeight_() const override;
-
- private:
- void PrintDecodedRawInfo() const;
-
- private:
- DecodedRawInfo info_;
-};
-} // namespace plusplayer
-
-#endif //__PLUSPLAYER_MIXER_TIZEN_HW_VIDEO_FRAME_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_RENDERABLE_OBJECT_FACTORY_H__
-#define __PLUSPLAYER_MIXER_TIZEN_RENDERABLE_OBJECT_FACTORY_H__
-
-#include <memory>
-
-#include "mixer/interfaces/memoryallocator.h"
-#include "mixer/interfaces/renderableobj_factory.h"
-
-namespace plusplayer {
-class TizenRenderableObjectFactory : public RenderableObjectFactory {
- public:
- explicit TizenRenderableObjectFactory(
- const MemoryAllocator* const memallocator);
- virtual ~TizenRenderableObjectFactory() = default;
-
- public:
- virtual RenderableObject* CreateRenderableObject(
- const std::uint32_t width, const std::uint32_t height) const override;
-
- private:
- const MemoryAllocator* const memallocator_;
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TIZEN_RENDERABLE_OBJECT_FACTORY_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TIZEN_SURFACE_VIDEO_FRAME_H__
-#define __PLUSPLAYER_MIXER_TIZEN_SURFACE_VIDEO_FRAME_H__
-
-#include <memory>
-
-#include "mixer/abs_videoframe.h"
-#include "mixer/interfaces/bufferobject.h"
-#include "plusplayer/decodedvideopacketex.h"
-
-namespace plusplayer {
-class TizenSurfaceVideoFrame : public AbstractVideoFrame {
- private:
- enum ComponentIndex { kYIndex = 0, kUVIndex = 1 };
-
- public:
- using BufferObjectPtr = std::unique_ptr<BufferObject>;
-
- public:
- explicit TizenSurfaceVideoFrame(DecodedVideoPacketExPtr dvp);
- virtual ~TizenSurfaceVideoFrame() = default;
-
- protected:
- virtual bool IsValid_() const override;
- virtual const std::uint32_t GetWidth_() const override;
- virtual const std::uint32_t GetHeight_() const override;
-
- private:
- DecodedVideoPacketExPtr dvp_;
- std::uint32_t width_;
- std::uint32_t height_;
-};
-} // namespace plusplayer
-
-#endif //__PLUSPLAYER_MIXER_TIZEN_SURFACE_VIDEO_FRAME_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TYPES_BUFFER_TYPE_H__
-#define __PLUSPLAYER_MIXER_TYPES_BUFFER_TYPE_H__
-
-#include <tbm_type_common.h>
-
-#include <cstdint>
-
-namespace plusplayer {
-
-using BufferDefaultType = tbm_bo;
-using BufferUnionHandleType = tbm_bo_handle;
-using BufferHandleType = decltype(BufferUnionHandleType::u32);
-using BufferPhysicalAddrType = decltype(BufferUnionHandleType::ptr);
-using BufferKeyType = tbm_key;
-
-const static BufferHandleType kInvalidBufferHandle = 0;
-const static BufferPhysicalAddrType kInvalidBufferPhysicalAddr = nullptr;
-const static BufferKeyType kInvalidBufferKey = 0;
-const static BufferKeyType kInvalidBufferSize = 0;
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TYPES_BUFFER_TYPE_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TYPES_PLANE_COMPONENT_H__
-#define __PLUSPLAYER_MIXER_TYPES_PLANE_COMPONENT_H__
-
-namespace plusplayer {
-
-enum class PlaneComponent {
- kYComponent,
- kUVComponent,
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TYPES_PLANE_COMPONENT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TYPES_VIDEO_PLANE_MAINIPULABLE_INFO_H__
-#define __PLUSPLAYER_MIXER_TYPES_VIDEO_PLANE_MAINIPULABLE_INFO_H__
-
-#include <cstdint>
-
-#include "mixer/types/buffertype.h"
-#include "mixer/types/planecomponent.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-
-struct VideoPlaneManipulableInfo {
- BufferHandleType handle;
- PlaneComponent component;
- std::uint32_t linesize;
- Geometry rect;
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TYPES_VIDEO_PLANE_MAINIPULABLE_INFO_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_TYPES_VIDEO_PLANE_MOVE_INFO_H__
-#define __PLUSPLAYER_MIXER_TYPES_VIDEO_PLANE_MOVE_INFO_H__
-
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-
-struct VideoPlaneMoveInfo {
- explicit VideoPlaneMoveInfo(const Geometry& current_gemetry, const Geometry& target_gemetry)
- : cur(current_gemetry), target(target_gemetry) {}
- Geometry cur;
- Geometry target;
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_TYPES_VIDEO_PLANE_MOVE_INFO_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_VIDEO_PLANE_H__
-#define __PLUSPLAYER_MIXER_VIDEO_PLANE_H__
-
-#include <cstdint>
-#include <memory>
-
-#include "mixer/interfaces/bufferobject.h"
-#include "mixer/interfaces/videoplanemanipulable.h"
-#include "mixer/types/planecomponent.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer {
-class VideoPlane : public VideoPlaneManipulable {
- public:
- explicit VideoPlane(PlaneComponent component, const std::uint32_t& width,
- const std::uint32_t& height);
- virtual ~VideoPlane() = default;
-
- public:
- virtual bool IsValid() const override;
- virtual VideoPlaneManipulableInfo GetVideoPlaneManipulableInfo()
- const override;
- virtual void SetCropArea(const CropArea& croparea) override;
-
- protected:
- virtual const BufferObject* const GetBufferObject_() const = 0;
- virtual std::uint32_t GetLineSize_() const;
-
- private:
- const PlaneComponent component_;
- const std::uint32_t width_;
- const std::uint32_t height_;
- CropArea croparea_;
-};
-
-class YComponentVideoPlane : public VideoPlane {
- public:
- using BufferObjectPtr = std::unique_ptr<BufferObject>;
-
- public:
- explicit YComponentVideoPlane(BufferObjectPtr buffer,
- const std::uint32_t& width,
- const std::uint32_t& height);
- virtual ~YComponentVideoPlane() = default;
-
- protected:
- virtual const BufferObject* const GetBufferObject_() const override;
-
- private:
- BufferObjectPtr buffer_;
-};
-
-class UVComponentVideoPlane : public VideoPlane {
- public:
- using BufferObjectPtr = std::unique_ptr<BufferObject>;
-
- public:
- explicit UVComponentVideoPlane(BufferObjectPtr buffer,
- const std::uint32_t& width,
- const std::uint32_t& height);
- virtual ~UVComponentVideoPlane() = default;
-
- protected:
- virtual const BufferObject* const GetBufferObject_() const override;
-
- private:
- BufferObjectPtr buffer_;
-};
-
-class YComponentVideoPlaneWithSharedMemory : public VideoPlane {
- public:
- using BufferObjectPtr = std::shared_ptr<BufferObject>;
- using BufferObjectWeakPtr = std::weak_ptr<BufferObject>;
-
- public:
- explicit YComponentVideoPlaneWithSharedMemory(BufferObjectWeakPtr buffer,
- const std::uint32_t& width,
- const std::uint32_t& height);
- virtual ~YComponentVideoPlaneWithSharedMemory() = default;
-
- protected:
- virtual std::uint32_t GetLineSize_() const override;
- virtual const BufferObject* const GetBufferObject_() const override;
-
- private:
- BufferObjectPtr buffer_;
- std::uint32_t width_;
-};
-
-class UVComponentVideoPlaneWithSharedMemory : public VideoPlane {
- public:
- using BufferObjectPtr = std::shared_ptr<BufferObject>;
- using BufferObjectWeakPtr = std::weak_ptr<BufferObject>;
-
- public:
- explicit UVComponentVideoPlaneWithSharedMemory(BufferObjectWeakPtr buffer,
- const std::uint32_t& width,
- const std::uint32_t& height);
- virtual ~UVComponentVideoPlaneWithSharedMemory() = default;
-
- public:
- virtual VideoPlaneManipulableInfo GetVideoPlaneManipulableInfo()
- const override;
-
- protected:
- virtual std::uint32_t GetLineSize_() const override;
- virtual const BufferObject* const GetBufferObject_() const override;
-
- private:
- BufferObjectPtr buffer_;
- std::uint32_t width_;
- std::uint32_t height_;
-};
-} // namespace plusplayer
-
-#endif //__PLUSPLAYER_MIXER_VIDEO_PLANE_H__
\ No newline at end of file
+++ /dev/null
-#include "mixer/abs_videoframe.h"
-
-namespace plusplayer {
-
-const std::vector<VideoPlaneManipulableInfo>
-AbstractVideoFrame::GetVideoPlaneManipInfo() const {
- if (IsValid() == false) return {};
- std::vector<VideoPlaneManipulableInfo> vector;
- for (const auto& plane : planes_) {
- vector.emplace_back(plane->GetVideoPlaneManipulableInfo());
- }
- return vector;
-}
-
-bool AbstractVideoFrame::IsValid() const {
- if (planes_.size() == 0) return false;
- if (GetWidth_() == 0 || GetHeight_() == 0) return false;
- if (IsValid_() == false) return false;
- return true;
-}
-
-bool AbstractVideoFrame::SetCropArea(const CropArea& croparea) {
- if (IsValid() == false) return false;
- for (auto& plane : planes_) {
- plane->SetCropArea(croparea);
- }
- return true;
-}
-
-const std::uint32_t AbstractVideoFrame::GetWidth() const {
- if (IsValid() == false) return 0;
- return GetWidth_();
-}
-
-const std::uint32_t AbstractVideoFrame::GetHeight() const {
- if (IsValid() == false) return 0;
- return GetHeight_();
-}
-
-void AbstractVideoFrame::RegisterVideoPlaneManipulablePtr_(
- VideoPlaneManipulablePtr vpmanip) {
- if (vpmanip == nullptr) return;
- planes_.emplace_back(std::move(vpmanip));
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/defaultmixer.h"
-
-#include <gst/gst.h>
-#include <trackrenderer_capi/display.h>
-
-#include <algorithm>
-#include <cstdint>
-#include <cstring>
-#include <fstream>
-#include <vector>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/rendererwithdoublebuf.h"
-#include "mixer/tizen/tizenbufferkeyvideoframe.h"
-#include "mixer/tizen/tizenhwvideoframe.h"
-#include "mixer/tizen/tizenrenderableobj_factory.h"
-#include "mixer/tizen/tizensurfacevideoframe.h"
-#include "mixer/types/videoplanemoveinfo.h"
-
-namespace plusplayer {
-
-namespace internal {
-TrackRendererDisplayMode ConvertToTrackRendererDisplayMode(
- const DisplayMode& mode);
-
-} // namespace internal
-DefaultMixer::DefaultMixer() : renderer_listener_(&trackrenderer_handle_) {
- LOG_ENTER;
- gst_init(NULL, NULL);
- trackrenderer_create(&trackrenderer_handle_);
-
- TizenRenderableObjectFactory factory(&bufmgr_);
- renderer_ = RendererPtr(new RendererWithDoubleBuffer(
- factory, &bufmgr_, &bufmgr_, whole_resolution_, &renderer_listener_));
- // renderer_ = RendererPtr(
- // new Renderer(factory, whole_resolution_, &renderer_listener_));
- InitResourceList_();
-}
-
-DefaultMixer::~DefaultMixer() {
- LOG_ENTER;
- trackrenderer_destroy(trackrenderer_handle_);
- LOG_LEAVE;
-}
-
-bool DefaultMixer::Start() {
- LOG_ENTER;
- std::lock_guard<std::mutex> lk(mixer_lock_);
- if (is_started_ == true) {
- LOG_ERROR("mixer was already started");
- return true;
- }
-
- if (renderer_->Start() == false) {
- LOG_ERROR("renderer start failed");
- return false;
- }
-
- TrackRendererTrack track;
- memset(&track, 0, sizeof(TrackRendererTrack));
- track.type = kTrackRendererTrackTypeVideo;
- track.index = 0;
- track.active = 1;
- track.mimetype = "video/x-raw";
- track.width = whole_resolution_.width;
- track.height = whole_resolution_.height;
- track.framerate_num = whole_resolution_.framerate_num;
- track.framerate_den = whole_resolution_.framerate_den;
-
- if (trackrenderer_set_track(trackrenderer_handle_, &track, 1) != 0) {
- LOG_ERROR("fail to set track");
- return false;
- }
-
- constexpr std::uint32_t kLowLatencyMode =
- 0x0111; // video disable avsync & videoquailty
- trackrenderer_set_attribute(trackrenderer_handle_, "low-latency-mode",
- kLowLatencyMode, nullptr);
- if (use_sub_scaler_) {
- constexpr std::uint32_t alternative_rsc = 1;
- trackrenderer_set_attribute(trackrenderer_handle_,
- "alternative-video-resource", alternative_rsc,
- nullptr);
- }
- if (trackrenderer_prepare(trackrenderer_handle_) != 0) {
- LOG_ERROR("fail to prepare");
- return false;
- }
- if (trackrenderer_start(trackrenderer_handle_) != 0) {
- LOG_ERROR("fail to start");
- return false;
- }
-
- is_started_ = true;
- LOG_LEAVE;
- return true;
-}
-
-bool DefaultMixer::Stop() {
- LOG_ENTER;
- std::lock_guard<std::mutex> lk(mixer_lock_);
- if (is_started_ == false) {
- LOG_ERROR("mixer was already stopped");
- return true;
- }
-
- if (renderer_->Stop() == false) {
- LOG_ERROR("renderer stop failed");
- }
-
- if (trackrenderer_stop(trackrenderer_handle_) != 0) {
- LOG_ERROR("fail to stop");
- }
-
- is_started_ = false;
- LOG_LEAVE;
- return true;
-}
-
-int DefaultMixer::GetMaximumAllowedNumberOfPlayer() {
- LOG_ENTER;
- // Fix me if we get policy and detail method (bc_hi.lee)
- constexpr int kMaximumAllowedNumberOfPlayer = 3;
- constexpr int kMaximumNumForNdecoder = 4;
- if (resource_allocation_mode_ == RscAllocMode::kNdecoder)
- return kMaximumNumForNdecoder;
- return kMaximumAllowedNumberOfPlayer;
-}
-
-bool DefaultMixer::SetDisplay(const DisplayType type, void* obj) {
- LOG_ENTER;
- TrackRendererDisplayType _type = kTrackRendererDisplayTypeNone;
- switch (type) {
- case DisplayType::kNone: {
- _type = kTrackRendererDisplayTypeNone;
- break;
- }
- case DisplayType::kOverlay: {
- _type = kTrackRendererDisplayTypeOverlay;
- break;
- }
- case DisplayType::kEvas: {
- _type = kTrackRendererDisplayTypeEvas;
- break;
- }
- default:
- LOG_ERROR("unknown displaytype");
- return false;
- }
- if (!trackrenderer_set_display(trackrenderer_handle_, _type, obj)) {
- return true;
- }
- return false;
-}
-
-bool DefaultMixer::SetDisplay(const DisplayType type, const uint32_t surface_id,
- const int x, const int y, const int w,
- const int h) {
- LOG_ENTER;
- TrackRendererDisplayType _type = kTrackRendererDisplayTypeNone;
- switch (type) {
- case DisplayType::kNone: {
- _type = kTrackRendererDisplayTypeNone;
- break;
- }
- case DisplayType::kOverlay: {
- _type = kTrackRendererDisplayTypeOverlay;
- break;
- }
- case DisplayType::kEvas: {
- _type = kTrackRendererDisplayTypeEvas;
- break;
- }
- default:
- LOG_ERROR("unknown displaytype");
- return false;
- }
- if (!trackrenderer_set_display_surface(trackrenderer_handle_, _type,
- surface_id, x, y, w, h)) {
- return true;
- }
- return false;
-}
-
-bool DefaultMixer::SetDisplayMode(const DisplayMode& mode) {
- LOG_ENTER;
- TrackRendererDisplayMode _mode =
- internal::ConvertToTrackRendererDisplayMode(mode);
- if (!trackrenderer_set_display_mode(trackrenderer_handle_, _mode)) {
- return true;
- }
- return false;
-}
-
-bool DefaultMixer::SetDisplayRoi(const Geometry& geometry) {
- LOG_ENTER;
- TrackRendererGeometry _geometry;
- memset(&_geometry, 0, sizeof(TrackRendererGeometry));
- _geometry.x = geometry.x;
- _geometry.y = geometry.y;
- _geometry.w = geometry.w;
- _geometry.h = geometry.h;
- if (!trackrenderer_set_display_roi(trackrenderer_handle_, &_geometry)) {
- return true;
- }
- return false;
-}
-
-bool DefaultMixer::SetRscAllocMode(const RscAllocMode& mode) {
- LOG_ENTER;
- std::lock_guard<std::mutex> lock(ticket_lock_);
- if (player_map_.size() != 0) {
- LOG_ERROR(
- "it have to be called before setting player's display type to mixer "
- "type");
- return false;
- }
- resource_allocation_mode_ = mode;
- return true;
-}
-
-bool DefaultMixer::DisableAudioFocusSetting() {
- LOG_ENTER;
- std::lock_guard<std::mutex> lock(ticket_lock_);
- if (player_map_.size() != 0) {
- LOG_ERROR(
- "it have to be called before setting player's display type to mixer "
- "type");
- return false;
- }
- enable_audio_focus_setting_ = false;
- if (audio_focused_player_) audio_focused_player_ = nullptr;
- return true;
-}
-
-bool DefaultMixer::SetAlternativeVideoScaler() {
- LOG_ENTER;
- use_sub_scaler_ = true;
- return true;
-}
-
-bool DefaultMixer::SetAudioFocus(const void* player_instance) {
- LOG_ENTER;
- if (!player_instance) return false;
- std::lock_guard<std::mutex> lock(ticket_lock_);
-
- if (!enable_audio_focus_setting_) return false;
-
- if (player_map_.count(player_instance) == 0) {
- audio_focused_player_ = player_instance;
- LOG_INFO("audio focus [%p]", audio_focused_player_);
- return true;
- }
-
- LOG_INFO("Active Audio player[%p]", player_instance);
- auto ticket = player_map_[player_instance];
- if (ticket->IsAudioFocused()) {
- LOG_INFO("already focused user");
- return true;
- }
-
- auto target = std::find_if(
- player_map_.begin(), player_map_.end(),
- [](const std::pair<const void*, Ticket*>& item) noexcept -> bool {
- return (item.second)->IsAudioFocused();
- });
-
- if (target != player_map_.end()) {
- if (target->second->GetListener()->OnAudioFocusChanged(false)) {
- target->second->SetAudioFocus(false);
- } else {
- LOG_ERROR("fail to change audio focus");
- return false;
- }
- } else {
- LOG_INFO("not found audio focused player");
- }
-
- if (ticket->GetListener()) {
- if (ticket->GetListener()->OnAudioFocusChanged(true)) {
- ticket->SetAudioFocus(true);
- return true;
- }
- }
- LOG_ERROR("fail to change audio focus");
- return false;
-}
-
-bool DefaultMixer::Commit() {
- LOG_ENTER;
- std::lock_guard<std::mutex> lock(ticket_lock_);
- std::vector<VideoPlaneMoveInfo> move_list;
- for (auto it = player_map_.begin(); it != player_map_.end(); ++it) {
- auto listener = it->second->GetListener();
- if (!listener) continue;
- DisplayInfo cur_info, new_info;
- it->second->GetDisplayInfo(&cur_info);
- if (listener->OnUpdateDisplayInfo(cur_info, &new_info)) {
- it->second->UpdateDisplayInfo(new_info);
- if (it->second->HasRenderedBefore() == true) {
- move_list.emplace_back(cur_info.geometry, new_info.geometry);
- }
- } else {
- LOG_ERROR("fail to update display info");
- }
- }
- renderer_->Move(&bufmgr_, move_list);
- return true;
-}
-
-bool DefaultMixer::SetResolution(const ResolutionInfo& info) {
- whole_resolution_ = info;
- renderer_->ChangeResolution(TizenRenderableObjectFactory(&bufmgr_),
- info.width, info.height);
- renderer_->ChangeRenderingSpeed(info.framerate_num, info.framerate_den);
- return true;
-}
-
-bool DefaultMixer::RegisterListener(MixerEventListener* listener) {
- LOG_ENTER;
- listener_ = listener;
- trackrenderer_set_resourceconflict_cb(trackrenderer_handle_,
- ResourceConflictCb_, this);
- trackrenderer_set_error_cb(trackrenderer_handle_, ErrorCb_, this);
- return true;
-}
-
-MixerTicket* DefaultMixer::CreateTicket(const void* player_instance) {
- std::lock_guard<std::mutex> lock(ticket_lock_);
- LOG_ENTER;
- auto ticket = new Ticket(this, player_instance);
- if (audio_focused_player_ == player_instance) {
- ticket->SetAudioFocus(true);
- LOG_INFO(" player [%p]", player_instance);
- }
- player_map_.emplace(player_instance, ticket);
- return ticket;
-}
-
-bool DefaultMixer::Detach_(const void* player_instance) {
- std::lock_guard<std::mutex> lock(ticket_lock_);
- LOG_ENTER;
- auto* ticket = player_map_.at(player_instance);
-
- if (ticket == nullptr) return false;
- if (ticket->HasRenderedBefore()) {
- DisplayInfo display_info;
- ticket->GetDisplayInfo(&display_info);
- // if this ticket is display visible status, draw black screen
- if (IsNeededToSkipRendering_(display_info) == false) {
- LOG_INFO(
- "player [%p] has been rendered before, so will mute on rendered "
- "region",
- player_instance);
- renderer_->Mute(&bufmgr_, display_info.geometry);
- }
- }
- ticket->DeallocResource();
- player_map_.erase(player_instance);
- return true;
-}
-
-bool DefaultMixer::Render_(const void* player_instance,
- const VideoPlaneCollection& vplanes) {
- DisplayInfo display_info;
- {
- std::lock_guard<std::mutex> t_lk(ticket_lock_);
- auto* ticket = player_map_.at(player_instance);
- if (ticket == nullptr) return false;
- ticket->GetDisplayInfo(&display_info);
- ticket->RecordRenderingTime();
- }
- if (IsNeededToSkipRendering_(display_info)) {
- LOG_INFO("Skip Rendering for player [%p]", player_instance);
- return true;
- }
- bool ret = renderer_->Render(&bufmgr_, &vplanes, display_info.geometry);
- if (ret == false) {
- LOG_INFO("Rendering Failed for player [%p]", player_instance);
- }
- return ret;
-}
-
-bool DefaultMixer::IsNeededToSkipRendering_(const DisplayInfo& display_info) {
- if (display_info.visible_status == VisibleStatus::kHide) return true;
- if (display_info.geometry.x == 0 && display_info.geometry.y == 0 &&
- display_info.geometry.w == 1 && display_info.geometry.h == 1)
- return true;
- return false;
-}
-
-void DefaultMixer::ResourceConflictCb_(UserData userdata) {
- auto mixer = static_cast<DefaultMixer*>(userdata);
- if (!mixer) return;
- mixer->listener_->OnResourceConflicted();
-}
-void DefaultMixer::ErrorCb_(const TrackRendererErrorType error_code,
- UserData userdata) {
- auto mixer = static_cast<DefaultMixer*>(userdata);
- if (!mixer) return;
- mixer->listener_->OnError();
-}
-
-bool DefaultMixer::Ticket::Render(const DecodedRawInfo& info) {
- LOG_INFO("player [%p] render frame [%d x %d]", player_instance_, info.width,
- info.height);
- TizenHWVideoFrame frame(info);
- frame.SetCropArea(each_display_info_.croparea);
- bool ret = handler_->Render_(player_instance_, frame);
- if (ret == false) {
- LOG_INFO("player [%p] rendering error", player_instance_);
- } else {
- has_rendered_ = true;
- }
- return ret;
-}
-
-bool DefaultMixer::Ticket::Render(const DecodedVideoKeyTypeInfo& info) {
- LOG_INFO("player [%p] render frame [%d x %d]", player_instance_, info.width,
- info.height);
- TizenBufferKeyVideoFrame frame(&handler_->bufmgr_, info.key, info.width,
- info.height);
- frame.SetCropArea(each_display_info_.croparea);
- bool ret = handler_->Render_(player_instance_, frame);
- if (ret == false) {
- LOG_INFO("player [%p] rendering error", player_instance_);
- } else {
- has_rendered_ = true;
- }
- return ret;
-}
-
-void DefaultMixer::InitResourceList_() {
- // Must be improved (bc_hi.lee)
- for (int type = static_cast<int>(ResourceType::kHwMain);
- type < static_cast<int>(ResourceType::kNdecoder); type++) {
- Resource resource;
- resource.category = ResourceCategory::kVideoDecoder;
- resource.type = static_cast<ResourceType>(type);
- resource_list_.push_back(std::move(resource));
- }
-}
-
-bool DefaultMixer::Ticket::GetAvailableResourceType(
- const ResourceCategory& category, ResourceType* type) {
- LOG_ENTER;
- std::lock_guard<std::mutex> lock(handler_->ticket_lock_);
- if (handler_->resource_allocation_mode_ == RscAllocMode::kDisable) {
- LOG_ERROR("mixer is no loger involved in resource alloc");
- return false;
- }
-
- if (handler_->resource_allocation_mode_ == RscAllocMode::kNdecoder) {
- *type = ResourceType::kNdecoder;
- return true;
- }
-
- for (const auto& item : handler_->resource_list_) {
- if (!item.assignee) {
- *type = item.type;
- LOG_INFO("Resource type [%d]", static_cast<int>(*type));
- return true;
- }
- }
- LOG_ERROR("no available resource type");
- return false;
-}
-
-bool DefaultMixer::Ticket::IsAudioFocusHandler() {
- std::lock_guard<std::mutex> lock(handler_->ticket_lock_);
- return handler_->enable_audio_focus_setting_;
-}
-
-bool DefaultMixer::Ticket::IsRscAllocHandler() {
- std::lock_guard<std::mutex> lock(handler_->ticket_lock_);
- return handler_->resource_allocation_mode_ != RscAllocMode::kDisable;
-}
-
-bool DefaultMixer::Ticket::Alloc(const ResourceCategory& category,
- const ResourceType& type) {
- std::lock_guard<std::mutex> lock(handler_->ticket_lock_);
- if (handler_->resource_allocation_mode_ == RscAllocMode::kDisable) {
- LOG_ERROR("mixer is no loger involved in resource alloc");
- return false;
- }
-
- if (type == ResourceType::kNdecoder) {
- LOG_INFO("Request N decoder");
- return true;
- }
-
- auto compare = [category, type](Resource item) -> bool {
- if (item.category == category && item.type == type && !item.assignee) {
- return true;
- }
- return false;
- };
- auto target = std::find_if(handler_->resource_list_.begin(),
- handler_->resource_list_.end(), compare);
- if (target == handler_->resource_list_.end()) {
- LOG_ERROR("Resource alloc fail");
- return false;
- }
- LOG_INFO("assignee %p", player_instance_);
- target->assignee = player_instance_;
- LOG_LEAVE;
- return true;
-}
-
-MixerTicketEventListener* DefaultMixer::Ticket::GetListener() {
- return ticket_listener_;
-}
-
-bool DefaultMixer::Ticket::IsAudioFocused() { return is_audio_focus_; }
-
-void DefaultMixer::Ticket::SetAudioFocus(bool active) {
- is_audio_focus_ = active;
-}
-
-void DefaultMixer::Ticket::GetDisplayInfo(DisplayInfo* info) {
- if (info == nullptr) return;
- *info = each_display_info_;
-}
-
-bool DefaultMixer::Ticket::HasRenderedBefore() { return has_rendered_; }
-
-void DefaultMixer::Ticket::UpdateDisplayInfo(const DisplayInfo& info) {
- LOG_INFO(
- "updated display info : geom[%d, %d, %d x %d] crop[%.3lf, %.3lf, %.3lf x "
- "%.3lf]",
- info.geometry.x, info.geometry.y, info.geometry.w, info.geometry.h,
- info.croparea.scale_x, info.croparea.scale_y, info.croparea.scale_w,
- info.croparea.scale_h);
- each_display_info_ = info;
-}
-
-void DefaultMixer::Ticket::DeallocResource() {
- auto compare = [this](Resource item) -> bool {
- if (item.assignee == player_instance_) {
- return true;
- }
- return false;
- };
-
- auto target = std::find_if(handler_->resource_list_.begin(),
- handler_->resource_list_.end(), compare);
- if (target == handler_->resource_list_.end()) {
- LOG_INFO("not found assignee");
- return;
- }
- target->assignee = nullptr;
-}
-
-void DefaultMixer::Ticket::RecordRenderingTime() {
- auto now = std::chrono::system_clock::now();
- LOG_INFO("[PERF] p[%p] render_interval[%llu]ms", player_instance_,
- std::chrono::duration_cast<std::chrono::milliseconds>(
- now - last_rendering_time_)
- .count());
- last_rendering_time_ = now;
-}
-
-bool DefaultMixer::Ticket::RegisterListener(
- MixerTicketEventListener* listener) {
- LOG_ENTER;
- ticket_listener_ = listener;
- return true;
-}
-
-bool DefaultMixer::Ticket::Prepare() {
- LOG_ENTER;
- DisplayInfo new_info;
- ticket_listener_->OnUpdateDisplayInfo(each_display_info_, &new_info);
- UpdateDisplayInfo(new_info);
- if (!handler_->enable_audio_focus_setting_) return true;
- LOG_INFO("audio focused [%d]", is_audio_focus_);
- ticket_listener_->OnAudioFocusChanged(is_audio_focus_);
- return true;
-}
-
-DefaultMixer::Ticket::~Ticket() {
- handler_->Detach_(player_instance_);
- LOG_LEAVE;
-}
-
-DefaultMixer::MixerRendererEventListener::MixerRendererEventListener(
- TrackRendererHandle* trhandle_ptr)
- : trhandle_ptr_(trhandle_ptr) {}
-
-DefaultMixer::MixerRendererEventListener::~MixerRendererEventListener() {}
-
-void* DefaultMixer::MixerRendererEventListener::CreateGstBuffer_(
- const BufferKeyType& key) const {
- if (key == 0) return nullptr;
- auto* gstbuffer = gst_buffer_new();
- auto* gststructure =
- gst_structure_new("tbm_bo", "tbm_bo_key", G_TYPE_UINT, key, nullptr);
- gst_mini_object_set_qdata(GST_MINI_OBJECT(gstbuffer),
- g_quark_from_static_string("tbm_bo"), gststructure,
- (GDestroyNotify)gst_structure_free);
- return static_cast<void*>(gstbuffer);
-}
-
-void DefaultMixer::MixerRendererEventListener::FillDecoderInputBuffer_(
- TrackRendererDecoderInputBuffer& buffer, const BufferKeyType& key) const {
- buffer.type = kTrackRendererTrackTypeVideo;
- buffer.index = 0;
- buffer.buffer = CreateGstBuffer_(key);
-}
-
-bool DefaultMixer::MixerRendererEventListener::OnRenderingRelease(
- const BufferKeyType& key) {
- if (trhandle_ptr_ == nullptr || *trhandle_ptr_ == nullptr) return false;
- TrackRendererDecoderInputBuffer buffer;
- FillDecoderInputBuffer_(buffer, key);
- TrackRendererSubmitStatus status;
- int ret = trackrenderer_submit_packet2(*trhandle_ptr_, &buffer, &status);
- if (ret != 0 && buffer.buffer != nullptr) {
- gst_buffer_unref(GST_BUFFER(buffer.buffer));
- }
- return ret == 0;
-}
-
-namespace internal {
-TrackRendererDisplayMode ConvertToTrackRendererDisplayMode(
- const DisplayMode& mode) {
- switch (mode) {
- case DisplayMode::kLetterBox:
- return kTrackRendererDisplayModeLetterBox;
- case DisplayMode::kOriginSize:
- return kTrackRendererDisplayModeOriginSize;
- case DisplayMode::kFullScreen:
- return kTrackRendererDisplayModeFullScreen;
- case DisplayMode::kCroppedFull:
- return kTrackRendererDisplayModeCroppedFull;
- case DisplayMode::kOriginOrLetter:
- return kTrackRendererDisplayModeOriginOrLetter;
- case DisplayMode::kDstRoi:
- return kTrackRendererDisplayModeDstRoi;
- case DisplayMode::kAutoAspectRatio:
- return kTrackRendererDisplayModeAutoAspectRatio;
- default:
- return kTrackRendererDisplayModeDisplayMax;
- }
-}
-
-} // namespace internal
-
-} // namespace plusplayer
+++ /dev/null
-#include "mixer/mixedframe.h"
-
-#include <cstring>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/interfaces/accessiblebuffer.h"
-
-namespace plusplayer {
-MixedFramePtr MixedFrame::Create(const MemoryAllocator* const memop,
- const std::uint32_t width,
- const std::uint32_t height) {
- return Ptr(new MixedFrame(memop, width, height));
-}
-
-MixedFrame::MixedFrame(const MemoryAllocator* const memop,
- const std::uint32_t width, const std::uint32_t height)
- : width_(width), height_(height) {
- if (memop == nullptr) return;
- const auto size = CalculateBufferSize_(width_, height_);
- if (size == 0) return;
- buffer_ = BufferObjectPtr(memop->Allocate(size));
- if (buffer_ == nullptr) return;
- allocated_size_ = buffer_->GetSize();
- if (allocated_size_ == 0) return;
-
- if (allocated_size_ != size) {
- LOG_WARN("size mismatched request [%u] allocated [%u]", size,
- allocated_size_);
- }
-
- if (auto* accessible_buffer =
- dynamic_cast<AccessibleBuffer*>(buffer_.get())) {
- auto ptr = accessible_buffer->GetWritableAddress();
- if (ptr == nullptr) return;
- const auto y_size = width_ * height_;
- const auto uv_size = y_size >> 1;
- {
- std::memset(static_cast<char*>(ptr->GetAddress()), (char)0x00, y_size);
- std::memset(static_cast<char*>(ptr->GetAddress()) + y_size, (char)0x80,
- uv_size);
- }
- LOG_DEBUG("MixedFrame UV memset done");
- }
-}
-
-const std::vector<VideoPlaneManipulableInfo>
-MixedFrame::GetVideoPlaneManipInfo() const {
- if (IsValid() == false) return {};
- auto handle = buffer_->GetBufferHandle();
- return {GetYComponentVMInfo_(handle), GetUVComponentVMInfo_(handle)};
-}
-
-bool MixedFrame::IsValid() const {
- if (width_ == 0 || height_ == 0) return false;
- if (allocated_size_ == 0) return false;
- if (buffer_ == nullptr) return false;
- return true;
-}
-
-std::uint32_t MixedFrame::GetWidth() const { return width_; }
-
-std::uint32_t MixedFrame::GetHeight() const { return height_; }
-
-std::uint32_t MixedFrame::GetSize() const {
- if (IsValid() == false) return 0;
- return allocated_size_;
-}
-
-bool MixedFrame::Render(const VideoPlaneManipulator* const vpmanip,
- const std::vector<VideoPlaneManipulableInfo>& planes,
- const Geometry& geom) {
- if (vpmanip == nullptr) return false;
- if (IsValid() == false) return false;
- bool ret = true;
- for (const auto& video_manipinfo : planes) {
- ret &= vpmanip->Do(video_manipinfo, GetMixedFrameVideoPlaneManipulableInfo_(
- video_manipinfo.component, geom));
- }
- return ret;
-}
-
-bool MixedFrame::Fill(const VideoPlaneColorManipulator* const vpmanip,
- const PlaneComponent& comp, const std::uint32_t& color,
- const Geometry& geom) {
- VideoPlaneManipulableInfo info =
- GetMixedFrameVideoPlaneManipulableInfo_(comp, geom);
- return vpmanip->Do(color, info);
-}
-
-bool MixedFrame::Export(BufferKeyType& key) const {
- if (IsValid() == false) return false;
- key = buffer_->Export();
- return true;
-}
-
-std::uint32_t MixedFrame::CalculateBufferSize_(const std::uint32_t width,
- const std::uint32_t height) {
- return (width * height * 3) >> 1;
-}
-
-VideoPlaneManipulableInfo MixedFrame::GetMixedFrameVideoPlaneManipulableInfo_(
- const PlaneComponent component, const Geometry& geom) {
- VideoPlaneManipulableInfo ret;
- ret.handle = buffer_->GetBufferHandle();
- ret.component = component;
- ret.linesize = GetWidth();
- if (component == PlaneComponent::kYComponent) {
- ret.rect = geom;
- } else {
- ret.rect.x = geom.x / 2;
- ret.rect.y = geom.y / 2 + GetHeight();
- ret.rect.w = geom.w / 2;
- ret.rect.h = geom.h / 2;
- }
- return ret;
-}
-
-VideoPlaneManipulableInfo MixedFrame::GetYComponentVMInfo_(
- BufferHandleType handle) const {
- VideoPlaneManipulableInfo info;
- info.handle = handle;
- info.linesize = GetWidth();
- info.rect.x = 0;
- info.rect.y = 0;
- info.rect.w = GetWidth();
- info.rect.h = GetHeight();
- info.component = PlaneComponent::kYComponent;
- return info;
-}
-
-VideoPlaneManipulableInfo MixedFrame::GetUVComponentVMInfo_(
- BufferHandleType handle) const {
- VideoPlaneManipulableInfo info;
- info.handle = handle;
- info.linesize = GetWidth();
- info.rect.x = 0;
- info.rect.y = GetHeight();
- info.rect.w = GetWidth() >> 1;
- info.rect.h = GetHeight() >> 1;
- info.component = PlaneComponent::kUVComponent;
- return info;
-}
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/mixer.h"
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/defaultmixer.h"
-
-namespace plusplayer {
-
-std::unique_ptr<Mixer> Mixer::Create() {
- auto instance = std::unique_ptr<DefaultMixer>(new DefaultMixer);
- LOG_INFO("Create Mixer [%p]", instance.get());
- return instance;
-}
-
-} // namespace plusplayer
+++ /dev/null
-#include "mixer_capi/mixer_capi.h"
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/mixer.h"
-#include "mixer/mixer_eventlistener.h"
-#include "plusplayer/types/display.h"
-
-using plusplayer::Mixer;
-
-struct MixerPriv;
-
-class listener_bridge : public plusplayer::MixerEventListener {
- public:
- listener_bridge() { LOG_ENTER }
- ~listener_bridge() { LOG_ENTER }
-
- virtual void OnResourceConflicted() {
- LOG_ENTER
- if (this->resource_conflicted_cb_)
- this->resource_conflicted_cb_(resource_conflicted_cb_userdata_);
- }
-
- private:
- mixer_resource_conflicted_cb resource_conflicted_cb_ = nullptr;
- void* resource_conflicted_cb_userdata_ = nullptr;
-
- friend int mixer_set_resource_conflicted_cb(
- mixer_handle pp, mixer_resource_conflicted_cb resource_conflicted_cb,
- void* userdata);
-};
-
-struct MixerPriv {
- std::unique_ptr<Mixer> mixer;
- std::unique_ptr<listener_bridge> listener{new listener_bridge()};
-
- friend MixerPriv* MixerPrivCreate();
- friend void MixerPrivDestroy(MixerPriv*& instance);
-
- private:
- MixerPriv() {}
- ~MixerPriv() {}
-};
-
-MixerPriv* MixerPrivCreate() {
- MixerPriv* instance = new MixerPriv();
- instance->mixer = Mixer::Create();
- instance->mixer->RegisterListener(instance->listener.get());
- return instance;
-}
-
-void MixerPrivDestroy(MixerPriv*& instance) {
- if (instance) delete instance;
- instance = nullptr;
-}
-
-inline bool is_null_(void* object) { return object == nullptr; }
-
-inline Mixer* cast_(mixer_handle mixer) {
- auto priv = static_cast<MixerPriv*>(mixer);
- return priv->mixer.get();
-}
-
-inline listener_bridge* listener_cast_(mixer_handle pp) {
- auto priv = static_cast<MixerPriv*>(pp);
- return priv->listener.get();
-}
-
-inline int convert_return_type_(bool ret) {
- return ret ? MIXER_ERROR_TYPE_NONE : MIXER_ERROR_TYPE_INVALID_OPERATION;
-}
-
-mixer_handle mixer_create() {
- LOG_ENTER
- mixer_handle mixer = static_cast<mixer_handle>(MixerPrivCreate());
- return mixer;
-}
-
-int mixer_destroy(mixer_handle handle) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- auto priv = static_cast<MixerPriv*>(handle);
- MixerPrivDestroy(priv);
-
- return MIXER_ERROR_TYPE_NONE;
-}
-
-int mixer_start(mixer_handle handle) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->Start());
-}
-
-int mixer_stop(mixer_handle handle) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->Stop());
-}
-
-int mixer_get_max_allowed_number_of_player(mixer_handle handle) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return cast_(handle)->GetMaximumAllowedNumberOfPlayer();
-}
-
-int mixer_set_display(mixer_handle handle, mixer_display_type type,
- void* window) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->SetDisplay(
- static_cast<plusplayer::DisplayType>(type), window));
-}
-
-int mixer_set_display_mode(mixer_handle handle, mixer_display_mode mode) {
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO("display mode : %d", static_cast<int>(mode));
- return convert_return_type_(cast_(handle)->SetDisplayMode(
- static_cast<plusplayer::DisplayMode>(mode)));
-}
-
-int mixer_set_display_roi(mixer_handle handle, const int x, const int y,
- const int width, const int height) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
- LOG_INFO("x : %d, y: %d, width : %d, height : %d", x, y, width, height);
- plusplayer::Geometry roi;
- roi.x = x;
- roi.y = y;
- roi.w = width;
- roi.h = height;
- return convert_return_type_(cast_(handle)->SetDisplayRoi(roi));
-}
-
-int mixer_set_rsc_alloc_mode(mixer_handle handle,
- const mixer_rsc_alloc_mode mode) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->SetRscAllocMode(
- static_cast<plusplayer::RscAllocMode>(mode)));
-}
-
-int mixer_disable_audio_focus_setting(mixer_handle handle) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->DisableAudioFocusSetting());
-}
-
-int mixer_set_alternative_video_scaler(mixer_handle handle) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->SetAlternativeVideoScaler());
-}
-
-int mixer_set_audio_focus(mixer_handle handle, const void* player_instance) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->SetAudioFocus(player_instance));
-}
-
-int mixer_commit(mixer_handle handle) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
-
- return convert_return_type_(cast_(handle)->Commit());
-}
-
-int mixer_set_resolution(mixer_handle handle, const int width, const int height,
- const int framerate_num, const int framerate_den) {
- LOG_ENTER
- if (is_null_(handle)) return MIXER_ERROR_TYPE_INVALID_PARAMETER;
- plusplayer::Mixer::ResolutionInfo info;
- info.width = width;
- info.height = height;
- info.framerate_num = framerate_num;
- info.framerate_den = framerate_den;
- return convert_return_type_(cast_(handle)->SetResolution(info));
-}
-
-mixer_ticket_h mixer_create_ticket(mixer_handle handle, const void* player_instance) {
- LOG_ENTER
- if (is_null_(handle)) return nullptr;
-
- return cast_(handle)->CreateTicket(player_instance);
-}
-
-int mixer_set_resource_conflicted_cb(
- mixer_handle handle, mixer_resource_conflicted_cb resource_conflicted_cb,
- void* userdata) {
- LOG_ENTER
- listener_bridge* listener = nullptr;
- if (is_null_(handle) || is_null_(listener = listener_cast_(handle))) {
- LOG_ERROR("Mixer or Listener object is nil.");
- return MIXER_ERROR_TYPE_INVALID_PARAMETER;
- }
- listener->resource_conflicted_cb_ = resource_conflicted_cb;
- listener->resource_conflicted_cb_userdata_ = userdata;
- return convert_return_type_(true);
-}
+++ /dev/null
-#include "mixer/renderer.h"
-
-#include "core/utils/plusplayer_log.h"
-
-namespace plusplayer {
-using std::chrono::duration_cast;
-using std::chrono::milliseconds;
-using std::chrono::system_clock;
-
-Renderer::Renderer(const RenderableObjectFactory& mf_factory,
- const Mixer::ResolutionInfo& rinfo,
- RendererEventListener* listener)
- : resolution_info_(rinfo),
- listener_(listener),
- frame_(RenderableObjectPtr(mf_factory.CreateRenderableObject(
- resolution_info_.width, resolution_info_.height))) {}
-
-Renderer::~Renderer() { Stop(); }
-
-bool Renderer::IsValid() const {
- if (frame_ == nullptr) return false;
- if (frame_->IsValid() == false) return false;
- return IsValid_();
-}
-
-bool Renderer::Start() {
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- if (rendering_worker_.joinable()) return false;
- rendering_flag_ = true;
- rendering_worker_ = std::thread(&Renderer::RenderingWorker_, this);
- return true;
-}
-
-bool Renderer::Stop() {
- {
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (rendering_worker_.joinable() == false) return false;
- rendering_flag_ = false;
- rendering_cv_.notify_all();
- }
- rendering_worker_.join();
- return true;
-}
-
-bool Renderer::ChangeResolution(const RenderableObjectFactory& mf_factory,
- const std::uint32_t& width,
- const std::uint32_t& height) {
- if (width == 0 || height == 0) return false;
- if (width == static_cast<std::uint32_t>(resolution_info_.width) &&
- height == static_cast<std::uint32_t>(resolution_info_.height))
- return false;
- return ChangeResolutionInternal_(mf_factory, width, height);
-}
-
-bool Renderer::ChangeResolutionInternal_(
- const RenderableObjectFactory& mf_factory, const std::uint32_t& width,
- const std::uint32_t& height) {
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- resolution_info_.width = width;
- resolution_info_.height = height;
- frame_.reset(nullptr);
- frame_ = RenderableObjectPtr(mf_factory.CreateRenderableObject(
- resolution_info_.width, resolution_info_.height));
- return IsValid();
-}
-
-bool Renderer::ChangeRenderingSpeed(const std::uint32_t framerate_num,
- const std::uint32_t framerate_den) {
- if (framerate_num == 0 || framerate_den == 0) return false;
- if (framerate_num ==
- static_cast<std::uint32_t>(resolution_info_.framerate_num) &&
- framerate_den ==
- static_cast<std::uint32_t>(resolution_info_.framerate_den))
- return false;
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- resolution_info_.framerate_num = framerate_num;
- resolution_info_.framerate_den = framerate_den;
- return true;
-}
-
-bool Renderer::Render(const VideoPlaneScaler* const scaler,
- const VideoPlaneCollection* const planes,
- const Geometry& geom) {
- if (scaler == nullptr) return false;
- if (planes == nullptr) return false;
- return RenderInternal_(scaler->GetScaleManipulator(),
- planes->GetVideoPlaneManipInfo(), geom);
-}
-
-bool Renderer::RenderInternal_(
- const VideoPlaneManipulator* const scaler,
- const std::vector<VideoPlaneManipulableInfo>& planes,
- const Geometry& geom) {
- if (scaler == nullptr) return false;
- const auto before = system_clock::now();
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- LOG_INFO("[PERF] RenderInternal_ Lock [%llu]ms",
- std::chrono::duration_cast<std::chrono::milliseconds>(
- system_clock::now() - before)
- .count());
- const auto ret = frame_->Render(scaler, planes, geom);
- LOG_INFO("[PERF] Scale [%llu]ms",
- std::chrono::duration_cast<std::chrono::milliseconds>(
- system_clock::now() - before)
- .count());
- return ret;
-}
-
-bool Renderer::Mute(const VideoPlaneColorFiller* const filler,
- const Geometry& geom) {
- if (filler == nullptr) return false;
- return MuteInternal_(filler->GetColorFillManipulator(), geom);
-}
-
-bool Renderer::MuteInternal_(const VideoPlaneColorManipulator* const filler,
- const Geometry& geom) {
- if (filler == nullptr) return false;
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- bool ret = true;
- ret &= frame_->Fill(filler, PlaneComponent::kYComponent, 0x00, geom);
- ret &= frame_->Fill(filler, PlaneComponent::kUVComponent, 0x8080, geom);
- return ret;
-}
-
-bool Renderer::Move(const VideoPlaneColorFiller* const filler,
- const std::vector<VideoPlaneMoveInfo>& moving_planes) {
- if (filler == nullptr) return false;
- if (moving_planes.size() == 0) return false;
- return MoveInternal_(filler->GetColorFillManipulator(), moving_planes);
-}
-
-bool Renderer::MoveInternal_(
- const VideoPlaneColorManipulator* const filler,
- const std::vector<VideoPlaneMoveInfo>& moving_planes) {
- if (filler == nullptr) return false;
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (IsValid() == false) return false;
- bool ret = true;
- for (const auto& move : moving_planes) {
- if (IsSameGeometry_(move.cur, move.target)) continue;
- ret &= frame_->Fill(filler, PlaneComponent::kYComponent, 0x00, move.cur);
- ret &= frame_->Fill(filler, PlaneComponent::kUVComponent, 0x8080, move.cur);
- }
- return true;
-};
-
-bool Renderer::OnRenderingBefore_(const RenderableObject* const frame) {
- return true;
-}
-
-bool Renderer::IsValid_() const { return true; }
-
-bool Renderer::RaiseOnRenderingReleaseEvent_(const BufferKeyType& key) {
- if (listener_ == nullptr) return false;
- return listener_->OnRenderingRelease(key);
-}
-
-std::uint32_t Renderer::GetNextRenderingTimeWithJitter_(
- const JitterType& jitter) const {
- const static std::int64_t kOneSecondInMs = 1000; // ms
- auto next = kOneSecondInMs /
- (resolution_info_.framerate_num / resolution_info_.framerate_den);
- auto jitter_in_ms = jitter.count();
- LOG_DEBUG("[PERF] jitter : [%lld]ms / next : [%lld]ms", jitter_in_ms, next);
- jitter_in_ms %= next;
- next -= jitter_in_ms;
- return next < 0 ? 0 : static_cast<std::uint32_t>(next);
-}
-
-void Renderer::RenderingWorker_() {
- LOG_DEBUG("Start Rendering");
- JitterType jitter(0);
- while (1) {
- LOG_DEBUG("= Start New Frame ===========================================");
- auto before_1 = system_clock::now();
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- if (rendering_flag_ == false) break;
- if (OnRenderingBefore_(frame_.get()) == false) {
- LOG_WARN("OnRenderingBefore_ Failed");
- continue;
- }
-
- LOG_DEBUG(
- "[PERF] before_1 ~ now : [%lld]ms",
- duration_cast<milliseconds>(system_clock::now() - before_1).count());
- jitter += duration_cast<milliseconds>(system_clock::now() - before_1);
-
- std::uint64_t next_in_ms = GetNextRenderingTimeWithJitter_(jitter);
-
- jitter = JitterType::zero();
- auto before_2 = system_clock::now();
- LOG_DEBUG("[PULSE] it will awake after [%llu]ms", next_in_ms);
- if (next_in_ms > 0) {
- rendering_cv_.wait_for(lk, milliseconds(next_in_ms),
- [this] { return rendering_flag_ == false; });
- // LOG_DEBUG(
- // "[PERF] before_2 ~ after awake : [%lld]ms",
- // duration_cast<milliseconds>(system_clock::now() -
- // before_2).count());
- if (rendering_flag_ == false) break;
- }
- if (IsValid() == false) continue;
-
- BufferKeyType key;
- if (frame_->Export(key) == false) {
- LOG_ERROR("MixedFrame Export Failed");
- continue;
- }
-
- RaiseOnRenderingReleaseEvent_(key);
- jitter = duration_cast<milliseconds>(system_clock::now() - before_2 -
- milliseconds(next_in_ms));
- // LOG_DEBUG(
- // "[PERF] before_2 ~ now : [%lld]ms / next_in_ms : [%llu]ms",
- // duration_cast<milliseconds>(system_clock::now() - before_2).count(),
- // next_in_ms);
- }
- std::unique_lock<std::mutex> lk(rendering_mtx_);
- rendering_flag_ = false;
- LOG_DEBUG("Rendering Stopped");
-}
-
-const Mixer::ResolutionInfo& Renderer::GetResolutionInfo_() const {
- return resolution_info_;
-}
-
-RenderableObjectPtr& Renderer::GetMixedFrame_() { return frame_; }
-
-void Renderer::AcquireRenderingLock_() { rendering_mtx_.lock(); }
-
-void Renderer::ReleaseRenderingLock_() { rendering_mtx_.unlock(); }
-
-Geometry Renderer::MakeGeometry_(const std::uint32_t& width,
- const std::uint32_t& height) {
- Geometry geom;
- geom.w = width;
- geom.h = height;
- return geom;
-}
-
-bool Renderer::IsSameGeometry_(const Geometry& g1, const Geometry& g2) {
- if (g1.x != g2.x) return false;
- if (g1.y != g2.y) return false;
- if (g1.w != g2.w) return false;
- if (g1.h != g2.h) return false;
- return true;
-}
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/sys/tbminterface.h"
-
-#include <tbm_bo.h>
-#include <tbm_bufmgr.h>
-
-namespace plusplayer {
-namespace tizen {
-BufferDefaultType TBMInterface::BoRef(BufferDefaultType bo) {
- return tbm_bo_ref(bo);
-}
-void TBMInterface::BoUnRef(BufferDefaultType bo) { tbm_bo_unref(bo); }
-
-int TBMInterface::BoSize(BufferDefaultType bo) { return tbm_bo_size(bo); }
-
-BufferUnionHandleType TBMInterface::BoGetHandle(BufferDefaultType bo,
- int device) {
- return tbm_bo_get_handle(bo, device);
-}
-
-BufferUnionHandleType TBMInterface::BoMap(BufferDefaultType bo, int device,
- int option) {
- return tbm_bo_map(bo, device, option);
-}
-
-void TBMInterface::BoUnmap(BufferDefaultType bo) { tbm_bo_unmap(bo); }
-
-BufferKeyType TBMInterface::BoExport(BufferDefaultType bo) {
- return tbm_bo_export(bo);
-}
-
-BufferDefaultType TBMInterface::BoAlloc(tbm_bufmgr bufmgr, int size, int flag) {
- return tbm_bo_alloc(bufmgr, size, flag);
-}
-BufferDefaultType TBMInterface::BoImport(tbm_bufmgr bufmgr, BufferKeyType key) {
- return tbm_bo_import(bufmgr, key);
-}
-
-int TBMInterface::GAScale(tbm_bufmgr bufmgr, GraphicsGAScaleInfo* info) {
- return Gfx_GA_Scale(bufmgr, info);
-}
-
-int TBMInterface::GACopy(tbm_bufmgr bufmgr, GraphicsGABltRopInfo* info) {
- return Gfx_GA_BltRop(bufmgr, info);
-}
-
-int TBMInterface::GAFill(tbm_bufmgr bufmgr, GraphicsGAFillRectInfo* info) {
- return Gfx_GA_FillRect(bufmgr, info);
-}
-} // namespace tizen
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/tizen/tizenaccessiblebufferobj.h"
-
-namespace plusplayer {
-
-TizenAccessibleBufferObject::TizenAccessibleBufferObject(
- BufferDefaultType buffer)
- : TizenBufferObject(buffer) {}
-
-TizenAccessibleBufferObject::PhyAddrAccessorPtr
-TizenAccessibleBufferObject::GetReadableAddress() const {
- if (IsValid() == false) return nullptr;
- return PhyAddrAccessorPtr(
- new TizenReadableBufferPhyAddrAccessor(GetBuffer_()));
-}
-
-TizenAccessibleBufferObject::PhyAddrAccessorPtr
-TizenAccessibleBufferObject::GetWritableAddress() const {
- if (IsValid() == false) return nullptr;
- return PhyAddrAccessorPtr(
- new TizenWritableBufferPhyAddrAccessor(GetBuffer_()));
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/tizen/tizenbufferkeyvideoframe.h"
-
-namespace plusplayer {
-
-TizenBufferKeyVideoFrame::TizenBufferKeyVideoFrame(
- const TizenBufferManager* const bufmgr, const BufferKeyType& key,
- const std::uint32_t& width, const std::uint32_t& height)
- : key_(key), width_(width), height_(height) {
- if (bufmgr == nullptr) return;
- if (key_ == 0) return;
- if (width_ == 0 || height_ == 0) return;
-
- auto buffer = BufferObjectPtr(bufmgr->Import(key_));
- if (buffer == nullptr) return;
- RegisterVideoPlaneManipulablePtr_(VideoPlaneManipulablePtr(
- new YComponentVideoPlaneWithSharedMemory(buffer, width_, height_)));
- RegisterVideoPlaneManipulablePtr_(VideoPlaneManipulablePtr(
- new UVComponentVideoPlaneWithSharedMemory(buffer, width_, height_)));
-}
-
-bool TizenBufferKeyVideoFrame::IsValid_() const {
- if (key_ == 0) return false;
- return true;
-}
-
-const std::uint32_t TizenBufferKeyVideoFrame::GetWidth_() const {
- return width_;
-}
-
-const std::uint32_t TizenBufferKeyVideoFrame::GetHeight_() const {
- return height_;
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/tizen/tizendefaultphyaddraccessor.h"
-
-namespace plusplayer {
-
-TizenDefaultPhyAddrAccessor::TizenDefaultPhyAddrAccessor(std::uint32_t viraddr)
- : viraddr_(viraddr) {}
-
-BufferPhysicalAddrType TizenDefaultPhyAddrAccessor::GetAddress() {
- return reinterpret_cast<BufferPhysicalAddrType>(viraddr_);
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/tizen/tizenhwbufferobj.h"
-
-// #include "mixer/tizen/tizendefaultphyaddraccessor.h"
-
-namespace plusplayer {
-TizenHWBufferObject::TizenHWBufferObject(const std::uint32_t& width,
- const std::uint32_t& height,
- const DecodedRawPlaneInfo& info)
- : width_(width), height_(height), info_(info) {}
-
-bool TizenHWBufferObject::IsValid() const {
- if (info_.phyaddr == 0) return false;
- if (width_ == 0 || height_ == 0 || info_.linesize == 0) return false;
- return true;
-}
-
-BufferHandleType TizenHWBufferObject::GetBufferHandle() const {
- if (IsValid() == false) return kInvalidBufferHandle;
- return static_cast<BufferHandleType>(info_.phyaddr);
-}
-
-BufferKeyType TizenHWBufferObject::Export() const { return kInvalidBufferKey; }
-
-std::uint32_t TizenHWBufferObject::GetSize() const {
- return height_ * info_.linesize;
-}
-
-} // namespace plusplayer
+++ /dev/null
-#include "mixer/tizen/tizenhwvideoframe.h"
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/tizen/tizenhwbufferobj.h"
-#include "mixer/videoplane.h"
-
-namespace plusplayer {
-
-TizenHWVideoFrame::TizenHWVideoFrame(const DecodedRawInfo& info) : info_(info) {
- if (IsValid_() == false) return;
-
- RegisterVideoPlaneManipulablePtr_(VideoPlaneManipulablePtr(
- new YComponentVideoPlane(BufferObjectPtr(new TizenHWBufferObject(
- info_.width, info_.height, info_.y_info)),
- info_.width, info_.height)));
- RegisterVideoPlaneManipulablePtr_(
- VideoPlaneManipulablePtr(new UVComponentVideoPlane(
- BufferObjectPtr(new TizenHWBufferObject(
- info_.width / 2, info_.height / 2, info_.uv_info)),
- info_.width, info_.height)));
-}
-
-bool TizenHWVideoFrame::IsValid_() const {
- if (info_.y_info.phyaddr == 0) return false;
- if (info_.y_info.linesize == 0) return false;
- if (info_.uv_info.phyaddr == 0) return false;
- if (info_.uv_info.linesize == 0) return false;
- return true;
-}
-
-const std::uint32_t TizenHWVideoFrame::GetWidth_() const { return info_.width; }
-
-const std::uint32_t TizenHWVideoFrame::GetHeight_() const {
- return info_.height;
-}
-
-void TizenHWVideoFrame::PrintDecodedRawInfo() const {
- LOG_DEBUG("WxH [%ux%u] Y [%u %u %u] / UV [%u %u %u]", info_.width,
- info_.height, info_.y_info.phyaddr, info_.y_info.viraddr,
- info_.y_info.linesize, info_.uv_info.phyaddr, info_.uv_info.viraddr,
- info_.uv_info.linesize);
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/tizen/tizenrenderableobj_factory.h"
-
-#include "mixer/mixedframe.h"
-
-namespace plusplayer {
-
-TizenRenderableObjectFactory::TizenRenderableObjectFactory(
- const MemoryAllocator* const memallocator)
- : memallocator_(memallocator) {}
-
-RenderableObject* TizenRenderableObjectFactory::CreateRenderableObject(
- const std::uint32_t width, const std::uint32_t height) const {
- return new MixedFrame(memallocator_, width, height);
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/tizen/tizensurfacevideoframe.h"
-
-#include <tbm_surface.h>
-#include <tbm_surface_internal.h>
-
-#include "mixer/tizen/tizenbufferobj.h"
-#include "mixer/videoplane.h"
-
-namespace plusplayer {
-
-TizenSurfaceVideoFrame::TizenSurfaceVideoFrame(DecodedVideoPacketExPtr dvp)
- : dvp_(std::move(dvp)) {
- auto surface = dvp_->GetTbmSurface();
- if (surface == nullptr) return;
-
- width_ = tbm_surface_get_width(surface);
- height_ = tbm_surface_get_height(surface);
- if (width_ == 0 || height_ == 0) return;
-
- auto y_bo = tbm_surface_internal_get_bo(surface, kYIndex);
- auto uv_bo = tbm_surface_internal_get_bo(surface, kUVIndex);
- if (y_bo == nullptr || uv_bo == nullptr) return;
-
- RegisterVideoPlaneManipulablePtr_(
- VideoPlaneManipulablePtr(new YComponentVideoPlane(
- BufferObjectPtr(new TizenBufferObject(y_bo)), width_, height_)));
- RegisterVideoPlaneManipulablePtr_(
- VideoPlaneManipulablePtr(new UVComponentVideoPlane(
- BufferObjectPtr(new TizenBufferObject(uv_bo)), width_, height_)));
-}
-
-bool TizenSurfaceVideoFrame::IsValid_() const {
- if (dvp_ == nullptr) return false;
- return true;
-}
-
-const std::uint32_t TizenSurfaceVideoFrame::GetWidth_() const { return width_; }
-
-const std::uint32_t TizenSurfaceVideoFrame::GetHeight_() const {
- return height_;
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-#include "mixer/videoplane.h"
-
-#include "core/utils/plusplayer_log.h"
-
-namespace plusplayer {
-
-/******************************************************************************
- * VideoPlane
- */
-VideoPlane::VideoPlane(PlaneComponent component, const std::uint32_t& width,
- const std::uint32_t& height)
- : component_(component), width_(width), height_(height) {}
-
-bool VideoPlane::IsValid() const {
- if (GetBufferObject_() == nullptr) return false;
- if (width_ == 0 || height_ == 0 || GetLineSize_() == 0) return false;
- return true;
-}
-
-VideoPlaneManipulableInfo VideoPlane::GetVideoPlaneManipulableInfo() const {
- VideoPlaneManipulableInfo info;
- info.component = component_;
- info.handle = GetBufferObject_()->GetBufferHandle();
- info.linesize = GetLineSize_();
- info.rect.x = width_ * croparea_.scale_x;
- info.rect.y = height_ * croparea_.scale_y;
- info.rect.w = width_ * croparea_.scale_w;
- info.rect.h = height_ * croparea_.scale_h;
- return info;
-}
-
-void VideoPlane::SetCropArea(const CropArea& croparea) { croparea_ = croparea; }
-
-std::uint32_t VideoPlane::GetLineSize_() const {
- return GetBufferObject_()->GetSize() / height_;
-}
-
-/******************************************************************************
- * YComponentVideoPlane
- */
-
-YComponentVideoPlane::YComponentVideoPlane(BufferObjectPtr buffer,
- const std::uint32_t& width,
- const std::uint32_t& height)
- : VideoPlane(PlaneComponent::kYComponent, width, height),
- buffer_(std::move(buffer)) {}
-
-const BufferObject* const YComponentVideoPlane::GetBufferObject_() const {
- return buffer_.get();
-}
-
-/******************************************************************************
- * UVComponentVideoPlane
- */
-
-UVComponentVideoPlane::UVComponentVideoPlane(BufferObjectPtr buffer,
- const std::uint32_t& width,
- const std::uint32_t& height)
- : VideoPlane(PlaneComponent::kUVComponent, width / 2, height / 2),
- buffer_(std::move(buffer)) {}
-
-const BufferObject* const UVComponentVideoPlane::GetBufferObject_() const {
- return buffer_.get();
-}
-
-/******************************************************************************
- * YComponentVideoPlaneWithSharedMemory
- */
-
-YComponentVideoPlaneWithSharedMemory::YComponentVideoPlaneWithSharedMemory(
- BufferObjectWeakPtr buffer, const std::uint32_t& width,
- const std::uint32_t& height)
- : VideoPlane(PlaneComponent::kYComponent, width, height),
- buffer_(buffer),
- width_(width) {}
-
-std::uint32_t YComponentVideoPlaneWithSharedMemory::GetLineSize_() const {
- return width_;
-}
-
-const BufferObject* const
-YComponentVideoPlaneWithSharedMemory::GetBufferObject_() const {
- return buffer_.get();
-}
-
-/******************************************************************************
- * UVComponentVideoPlaneWithSharedMemory
- */
-
-UVComponentVideoPlaneWithSharedMemory::UVComponentVideoPlaneWithSharedMemory(
- BufferObjectWeakPtr buffer, const std::uint32_t& width,
- const std::uint32_t& height)
- : VideoPlane(PlaneComponent::kUVComponent, width / 2, height / 2),
- buffer_(buffer),
- width_(width),
- height_(height) {}
-
-VideoPlaneManipulableInfo
-UVComponentVideoPlaneWithSharedMemory::GetVideoPlaneManipulableInfo() const {
- auto info = VideoPlane::GetVideoPlaneManipulableInfo();
- info.rect.y += height_;
- return info;
-}
-
-std::uint32_t UVComponentVideoPlaneWithSharedMemory::GetLineSize_() const {
- return width_;
-}
-
-const BufferObject* const
-UVComponentVideoPlaneWithSharedMemory::GetBufferObject_() const {
- return buffer_.get();
-}
-
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-# Appendix\r
+++ /dev/null
-# Add inputs and outputs from these tool invocations to the build variables\r
-\r
-\r
-OS_NAME := $(shell $(UNAME))\r
-\r
-\r
-#ifeq ($(origin BUILD_CONFIG), undefined)\r
-BUILD_CONFIG ?= Debug\r
-#endif\r
-\r
-#ifeq ($(origin ARCH), undefined)\r
-ARCH ?= i386\r
-#endif\r
-\r
-#ifeq ($(origin PROJPATH), undefined)\r
-PROJPATH ?= .\r
-#endif\r
-\r
-\r
-#ifeq ($(origin PROJ_PATH), undefined)\r
-PROJ_PATH ?= $(PROJPATH)\r
-#endif\r
-\r
-#ifeq ($(strip $(OUTPUT_DIR)),)\r
-#OUTPUT_DIR ?= $(PROJ_PATH)/$(BUILD_CONFIG)\r
-#endif\r
-\r
-#ifeq ($(strip $(BUILD_ARCH)),)\r
-BUILD_ARCH ?= $(ARCH)\r
-#endif\r
-\r
-#ifeq ($(strip $(ENVENTOR_PATH)),)\r
-ENVENTOR_PATH ?= $(SDK_TOOLPATH)/enventor\r
-#endif\r
+++ /dev/null
-# C/C++ build script\r
-\r
-\r
-_FUNC_EXT2O = $(patsubst %.$(3),$(1)/%.o,$(2))\r
-_FUNC_C2O = $(call _FUNC_EXT2O,$(1),$(2),c)\r
-_FUNC_CPP2O = $(call _FUNC_EXT2O,$(1),$(2),cpp)\r
-\r
-\r
-# parameter :\r
-# $(1) - C/C++ soruce file\r
-# $(2) - output path\r
-# $(3) - .ext\r
-# $(4) - unique id\r
-CONVERT_ESC_EXT_TO_O = $(addprefix $(2)/,$(notdir $(patsubst %.$(3),%-$(4).o,$(1))))\r
-\r
-#CONVERT_ESC_C_TO_O = $(call CONVERT_ESC_EXT_TO_O,$(1),$(2),c)\r
-#CONVERT_ESC_CPP_TO_O = $(call CONVERT_ESC_EXT_TO_O,$(1),$(2),cpp)\r
-\r
-\r
-# parameter :\r
-# $(1) - encoded one C/C++ soruce file\r
-# $(2) - output path\r
-# $(3) - ext title (C/C++)\r
-# $(4) - ext (c/cpp)\r
-# $(5) - compiler ($(CC)/$(CXX))\r
-# $(6) - build opt\r
-# $(7) - build opt file\r
-# output :\r
-# $(8) - output files list\r
-define C_BUILD_PROC_RAW\r
-$(call CONVERT_ESC_EXT_TO_O,$(1),$(2),$(4),$(8)) : $(call DECODE_4MAKE,$(1)) $(7)\r
- @echo ' Building file: $$<'\r
- @echo ' Invoking: $(3) Compiler'\r
- $$(call MAKEDIRS,$$(@D))\r
- $(5) -c "$$<" -o "$$@" $(6) -Wp,@$(7)\r
- @echo ' Finished building: $$<'\r
-$(9) += $(call CONVERT_ESC_EXT_TO_O,$(1),$(2),$(4),$(8))\r
-endef\r
-\r
-\r
-# parameter :\r
-# $(1) - output paths\r
-# $(2) - src paths\r
-# $(3) - inc paths\r
-# $(4) - inc files\r
-# $(5) - Defs\r
-# $(6) - UnDefs\r
-# $(7) - compiler opt\r
-# $(8) - compiler opt file\r
-# $(9) - ext title (C/C++)\r
-# $(10) - ext (c/cpp)\r
-# $(11) - compiler ($(CC)/$(CXX))\r
-# output :\r
-# $(12) - OBJS\r
-# return :\r
-# none\r
-define C_PROC_RAW\r
-\r
-_OUTPUT_DIR := $$(strip $(1))#\r
-_SRCS := $(2)#\r
-_INCS := $(3)#\r
-_INC_FILES := $(4)#\r
-_DEFS := $(5)#\r
-_UNDEFS := $(6)#\r
-\r
-_OPT := $(7)\r
-_OPT_FILE := $(8)\r
-\r
-_EXT_TITLE := $(9)\r
-_EXT := $(10)\r
-_COMPILER := $(11)\r
-\r
-#_OUTPUT_FILES := $(12)\r
-\r
-_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_SRCS))\r
-_ENC_SRCS := $$(filter %.$$(_EXT),$$(_ENC_SRCS))\r
-\r
-ifneq ($$(strip $$(_SRCS)),)\r
-\r
-_NORMAL_SRCS := $$(filter-out %*.$$(_EXT),$$(_ENC_SRCS))\r
-_WIDLCARD_SRCS := $$(filter %*.$$(_EXT),$$(_ENC_SRCS))\r
-\r
-_ALL_SRCS := $$(call DECODE_4MAKE,$$(_NORMAL_SRCS)) \\r
- $$(foreach var,$$(_WIDLCARD_SRCS),$$(call FIND_FILES_4MAKE,$$(call DECODE_4MAKE,$$(var))))\r
-\r
-ifneq ($$(strip $$(_ALL_SRCS)),)\r
-\r
-_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_ALL_SRCS))\r
-\r
-_CDEFS := $$(CDEFS)\r
-_CDEFS += $$(addprefix -D,$$(_DEFS))\r
-_CDEFS += $$(addprefix -U,$$(_UNDEFS))\r
-\r
-_ENC_C_INCS := $$(call ENCODE_4MAKE,$$(_INCS))\r
-_ENC_C_INCS := $$(addprefix -I,$$(_ENC_C_INCS))\r
-\r
-_ENC_INC_FILES := $$(call ENCODE_4MAKE,$$(_INC_FILES))\r
-_ENC_INC_FILES += $$(addprefix -include,$$(_ENC_INC_FILES))\r
-\r
-_C_INCS := $$(call DECODE_4MAKE,$$(_ENC_C_INCS) $$(_ENC_C_INC_FILES))\r
-\r
-_DEFS := $$(_CDEFS) $$(_C_INCS) -I"pch" $$(_OPT)\r
-\r
-_UNIQUE_ID = $$(firstword $$(shell echo $$(var) | $$(CKSUM)))\r
-\r
-$$(foreach var,$$(_ENC_SRCS),$$(eval $$(call C_BUILD_PROC_RAW,$$(var),$$(_OUTPUT_DIR),$$(_EXT_TITLE),$$(_EXT),$$(_COMPILER),$$(_DEFS),$$(_OPT_FILE),$$(_UNIQUE_ID),$(12))))\r
-\r
-endif # (_(strip _(_ALL_SRCS)),)\r
-\r
-endif # (_(strip _(_SRCS)),)\r
-\r
-\r
-endef\r
+++ /dev/null
-# EDC build script\r
-\r
-\r
-FUNC_EDC2EDJ = $(patsubst %.edc,$(2)/%.edj,$(1))\r
-\r
-# parameter :\r
-# $(1) - C/C++ soruce file\r
-# $(2) - output path\r
-CONVERT_ESC_EDC_TO_EDJ = $(call CONVERT_4MAKE_TO_OUT,$(call FUNC_EDC2EDJ,$(1),$(2)))\r
-\r
-\r
-# parameter :\r
-# $(1) - encoded one C/C++ soruce file\r
-# $(2) - output path\r
-# $(3) - build opt\r
-# output :\r
-# $(4) - output files list\r
-define EDJ_BUILD_PROC_RAW\r
-$(call CONVERT_ESC_EDC_TO_EDJ,$(1),$(2)) : $(call DECODE_4MAKE,$(1))\r
- @echo ' Building file: $$<'\r
- @echo ' Invoking: EDC Resource Compiler'\r
- $$(call MAKEDIRS,$$(@D))\r
- $$(EDJE_CC) $(3) "$$<" "$$@"\r
- @echo ' Finished building: $$<'\r
-$(4) += $(call CONVERT_ESC_EDC_TO_EDJ,$(1),$(2))\r
-endef\r
-\r
-\r
-# parameter :\r
-# $(1) - output paths\r
-# $(2) - src paths\r
-# $(3) - image inc paths\r
-# $(4) - sound inc paths\r
-# $(5) - font inc paths\r
-# output :\r
-# $(6) - OBJS \r
-# return :\r
-# none\r
-define EDJ_PROC_RAW\r
-\r
-_OUTPUT_DIR := $$(strip $(1))#\r
-_SRCS := $(2)# \r
-_IMAGE_DIRS := $(3)# \r
-_SOUND_DIRS := $(4)# \r
-_FONT_DIRS := $(5)# \r
-\r
-ifneq ($$(strip $$(_SRCS)),)\r
-\r
-_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_SRCS)) \r
-\r
-_NORMAL_SRCS := $$(filter-out %*.edc,$$(_ENC_SRCS))\r
-_WIDLCARD_SRCS := $$(filter %*.edc,$$(_ENC_SRCS))\r
-\r
-_ALL_SRCS := $$(call DECODE_4MAKE,$$(_NORMAL_SRCS)) \\r
- $$(foreach var,$$(_WIDLCARD_SRCS),$$(call FIND_FILES_4MAKE,$$(call DECODE_4MAKE,$$(var))))\r
-\r
-ifneq ($$(strip $$(_ALL_SRCS)),)\r
-\r
-_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_ALL_SRCS)) \r
-\r
-_COMPILER_FLAGS := -id "$$(ENVENTOR_SHARED_RES_PATH)/images"\r
-_COMPILER_FLAGS += -sd "$$(ENVENTOR_SHARED_RES_PATH)/sounds"\r
-_COMPILER_FLAGS += -fd "$$(ENVENTOR_SHARED_RES_PATH)/fonts"\r
-\r
-ifneq ($$(strip $$(_IMAGE_DIRS)),)\r
-_COMPILER_FLAGS += $$(addprefix -id ,$$(_IMAGE_DIRS))\r
-endif\r
-ifneq ($$(strip $$(_SOUND_DIRS)),)\r
-_COMPILER_FLAGS += $$(addprefix -sd ,$$(_SOUND_DIRS))\r
-endif\r
-ifneq ($$(strip $$(_FONT_DIRS)),)\r
-_COMPILER_FLAGS += $$(addprefix -fd ,$$(_FONT_DIRS))\r
-endif\r
-\r
-$$(foreach var,$$(_ENC_SRCS),$$(eval $$(call EDJ_BUILD_PROC_RAW,$$(var),$$(_OUTPUT_DIR),$$(_COMPILER_FLAGS),$(6))))\r
-\r
-endif # (_(strip _(_ALL_SRCS)),)\r
-\r
-endif # (_(strip _(_SRCS)),)\r
-\r
-endef\r
+++ /dev/null
-# PO build script\r
-\r
-\r
-_FUNC_PO2MO = $(patsubst %.po,$(2)/res/locale/%/LC_MESSAGES/$(3).mo,$(notdir $(1)))\r
-\r
-\r
-# parameter :\r
-# $(1) - C/C++ soruce file\r
-# $(2) - output path\r
-# $(3) - app name\r
-CONVERT_ESC_PO_TO_MO = $(call CONVERT_4MAKE_TO_OUT,$(call _FUNC_PO2MO,$(1),$(2),$(3)))\r
-\r
-\r
-# parameter :\r
-# $(1) - encoded one C/C++ soruce file\r
-# $(2) - output path\r
-# $(3) - app name\r
-# output :\r
-# $(4) - output files list\r
-define MO_BUILD_PROC_RAW\r
-$(call CONVERT_ESC_PO_TO_MO,$(1),$(2),$(3)) : $(call DECODE_4MAKE,$(1))\r
- @echo ' Building file: $$<'\r
- @echo ' Invoking: msgfmt String Formatter'\r
- $$(call MAKEDIRS,$$(@D))\r
- $$(MSGFMT) -o "$$@" "$$<"\r
- @echo ' Finished building: $$<'\r
-$(4) += $(call CONVERT_ESC_PO_TO_MO,$(1),$(2),$(3))\r
-endef\r
-\r
- \r
-# parameter :\r
-# $(1) - output dir\r
-# $(2) - src paths\r
-# $(3) - app name\r
-# output :\r
-# $(4) - OBJS \r
-\r
-define MO_PROC_RAW\r
-\r
-_OUTPUT_DIR := $(1)\r
-_SRCS := $(2)\r
-_APPNAME := $(3)\r
-\r
-ifneq ($$(strip $$(_SRCS)),)\r
-\r
-_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_SRCS)) \r
-\r
-_NORMAL_SRCS := $$(filter-out %*.po,$$(_ENC_SRCS))\r
-_WIDLCARD_SRCS := $$(filter %*.po,$$(_ENC_SRCS))\r
-\r
-_ALL_SRCS := $$(call DECODE_4MAKE,$$(_NORMAL_SRCS)) \\r
- $$(foreach var,$$(_WIDLCARD_SRCS),$$(call FIND_FILES_4MAKE,$$(call DECODE_4MAKE,$$(var))))\r
-\r
-ifneq ($$(strip $$(_ALL_SRCS)),)\r
-\r
-_ENC_SRCS := $$(call ENCODE_4MAKE,$$(_ALL_SRCS)) \r
-\r
-$$(foreach var,$$(_ENC_SRCS),$$(eval $$(call MO_BUILD_PROC_RAW,$$(var),$$(_OUTPUT_DIR),$$(_APPNAME),$(4))))\r
-\r
-endif # (_(strip _(_ALL_SRCS)),)\r
-\r
-endif # (_(strip _(_SRCS)),)\r
-\r
-endef\r
+++ /dev/null
-ifeq ($(strip $(BUILD_CONFIG)),Debug)\r
-DEBUG_OP = -g2\r
-CPP_DEBUG_OP = -g2\r
-\r
-OPTIMIZATION_OP = -O1\r
-CPP_OPTIMIZATION_OP = -O1\r
-else\r
-DEBUG_OP = -g0\r
-CPP_DEBUG_OP = -g0\r
-\r
-OPTIMIZATION_OP = -O2\r
-CPP_OPTIMIZATION_OP = -O2\r
-endif\r
-\r
-COMPILE_FLAGS = $(CFLAGS) $(DEBUG_OP) $(OPTIMIZATION_OP) \r
-\r
-CPP_COMPILE_FLAGS = $(CXXFLAGS) $(CPP_DEBUG_OP) $(CPP_OPTIMIZATION_OP) -Wall -Werror -std=c++11 -w -c -fmessage-length=0 -DPLUPLAYER_DOWNLOADABLE_APP_TVPLUS -fPIC \r
-\r
-LINK_FLAGS = $(CFLAGS) -shared -Wl,-z,relro \r
-\r
-AR_FLAGS = \r
-\r
-EDC_COMPILE_FLAGS = \r
+++ /dev/null
-\r
-BSLASH := \\#\r
-NULL_CHAR := #\r
-SPACE := \ #\r
-COLON := :#\r
-DOTDOT := ..#\r
-SPACE_ESC := &sp;#\r
-COLON_ESC := &co;#\r
-SPACE_OUT := ~sp~#\r
-COLON_OUT := ~co~#\r
-DOTDOT_OUT := ~dtdt~#\r
-\r
-BSLASH2SLASH = $(subst $(BSLASH),/,$(1))\r
-\r
-REMOVE_TAIL = $(patsubst %/,%,$(1))\r
-\r
-#LOWER_CASE = $(shell echo translit($(1),[A-Z],[a-z])|$(M4))\r
-LOWER_CASE = $(shell echo $(1)|$(TR) [A-Z] [a-z])\r
-\r
-#ifneq ($(findstring Windows,$(OS)),)\r
-# ...\r
-#endif\r
-\r
-FIND_FILES = $(shell $(FIND) $(1)/$(2) | $(SED) 's/^$(subst /,$(BSLASH)/,$(1))$(BSLASH)///')\r
-FIND_FILES_ESC = $(shell $(FIND) $(1)/$(2) | $(SED) 's/^$(subst /,$(BSLASH)/,$(1))$(BSLASH)///' -e 's/:/$(BSLASH)&co;/g' -e 's/$(BSLASH) /$(BSLASH)&sp;/g')\r
-FIND_FILES_4MAKE = $(shell $(FIND) $(1)/$(2) | $(SED) 's/^$(subst /,$(BSLASH)/,$(1))$(BSLASH)///')\r
-\r
-FIND_FILES_ABS = $(shell $(FIND) $(1))\r
-FIND_FILES_ABS_4MAKE = $(shell $(FIND) $(1) -e 's/$(BSLASH) /$(BSLASH)&sp;/g')\r
-FIND_FILES_ABS_ESC = $(shell $(FIND) $(1) -e 's/:/$(BSLASH)&co;/g' -e 's/$(BSLASH) /$(BSLASH)&sp;/g')\r
-\r
-FIND_FILES_4MAKE = $(shell $(FIND) $(1) | $(SED) 's/ /\\\ /g')\r
-\r
-#ENCODE_ESC = $(shell echo $(1) | $(SED) -e 's/:/$(BSLASH)&co;/g' -e 's/$(BSLASH) /$(BSLASH)&sp;/g')\r
-#DECODE_ESC = $(shell echo $(1) | $(SED) -e 's/$(BSLASH)&co;/:/g' -e 's/$(BSLASH)&sp;/$(BSLASH) / g')\r
-ENCODE_ESC = $(subst $(SPACE),$(SPACE_ESC),$(subst $(COLON),$(COLON_ESC),$(1)))\r
-DECODE_ESC = $(subst $(COLON_ESC),$(COLON),$(subst $(SPACE_ESC),$(SPACE),$(1)))\r
-ENCODE_4MAKE = $(subst $(SPACE),$(SPACE_ESC),$(1))\r
-DECODE_4MAKE = $(subst $(SPACE_ESC),$(SPACE),$(1))\r
-\r
-CONVERT_TO_OUT = $(subst $(DOTDOT),$(DOTDOT_OUT),$(subst $(COLON),$(COLON_OUT),$(subst $(SPACE),$(SPACE_OUT),$(1))))\r
-CONVERT_ESC_TO_OUT = $(subst $(DOTDOT),$(DOTDOT_OUT),$(subst $(COLON_ESC),$(COLON_OUT),$(subst $(SPACE_ESC),$(SPACE_OUT),$(1))))\r
-CONVERT_4MAKE_TO_OUT = $(subst $(DOTDOT),$(DOTDOT_OUT),$(subst $(COLON),$(COLON_OUT),$(subst $(SPACE_ESC),$(SPACE_OUT),$(1))))\r
-\r
-PROC_NO_EXIST = $(if $(wildcard $(1)),,$(call $(2),$(1)))\r
-define MAKEDIRS0\r
- @echo ' Building directory: $(1)'\r
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(1))\r
-endef\r
-MAKEDIRS = $(call PROC_NO_EXIST,$(1),MAKEDIRS0)\r
+++ /dev/null
-# \r
-# Usege : make -f <proj_root>/Build/makefile -C <proj_root> \r
-#\r
- \r
-BUILD_SCRIPT_VERSION := 1.1.0\r
-\r
-.PHONY : app_version app_build app_clean build_version\r
-\r
-\r
-all : app_build\r
-\r
-clean : app_clean\r
-\r
-version : build_version\r
-\r
-#PROJ_ROOT = .\r
-#BUILD_ROOT := $(PROJ_PATH)/Build#\r
-\r
-ifeq ($(MAKE_NAME),mingw32-make)\r
-ifneq ($(SHELL),)\r
-OPTIONS += --eval="SHELL=$(SHELL)"\r
-endif\r
-endif\r
-\r
-app_build :\r
- @echo $(MAKE) -f "$(BUILD_ROOT)/makefile.mk"\r
- @$(MAKE_BIN) -f "$(BUILD_ROOT)/makefile.mk" -C "$(PROJ_PATH)" $(OPTIONS)\r
-\r
-app_clean :\r
- @$(MAKE) -f "$(BUILD_ROOT)/makefile.mk" -C "$(PROJ_PATH)" $(OPTIONS) clean\r
-\r
-build_version :\r
- @echo makefile : $(BUILD_SCRIPT_VERSION)\r
- @$(MAKE) -f "$(BUILD_ROOT)/makefile.mk" -C "$(PROJ_PATH)" $(OPTIONS) version\r
+++ /dev/null
-#\r
-# Usege : make -f <proj_root>/Build/makefile -C <proj_root>\r
-#\r
-\r
-BUILD_SCRIPT_VERSION := 1.2.3\r
-\r
-.PHONY : app_version app_clean build_version\r
-\r
-\r
-all : app_build\r
-\r
-clean : app_clean\r
-\r
-version : build_version\r
-\r
-_BLANK :=#\r
-_SPACE := $(_BLANK) $(_BLANK)#\r
-_SPACE_4MAKE := \$(_SPACE)#\r
-\r
-NULL_CHAR :=#\r
-SPACE := $(NULL_CHAR) $(NULL_CHAR)#\r
-\r
-PROJ_ROOT := .\r
-_PROJ_ROOT_4MAKE := $(subst $(_SPACE),$(_SPACE_4MAKE),$(PROJ_ROOT))#\r
-PROJ_ROOT=$(_PROJ_ROOT_4MAKE)\r
-_BUILD_ROOT_4MAKE := $(subst $(_SPACE),$(_SPACE_4MAKE),$(BUILD_ROOT))#\r
-BUILD_ROOT=$(_BUILD_ROOT_4MAKE)\r
-\r
-include $(BUILD_ROOT)/basedef.mk\r
-\r
-include $(PROJ_ROOT)/project_def.prop\r
--include $(PROJ_ROOT)/build_def.prop\r
-\r
-include $(BUILD_ROOT)/funcs.mk\r
-\r
--include $(BUILD_ROOT)/tooldef.mk\r
--include $(BUILD_ROOT)/flags.mk\r
--include $(BUILD_ROOT)/platform.mk\r
-\r
-\r
-APPTYPE := $(type)\r
-\r
-OUTPUT_DIR := $(PROJ_ROOT)/$(BUILD_CONFIG)\r
-OBJ_OUTPUT := $(OUTPUT_DIR)/objs\r
-\r
-LOWER_APPNAME := $(call LOWER_CASE,$(APPNAME))\r
-APPID2 := $(subst $(basename $(APPID)).,,$(APPID))\r
-\r
-ifeq ($(strip $(APPTYPE)),app)\r
-APPFILE := $(OUTPUT_DIR)/$(LOWER_APPNAME)\r
-endif\r
-ifeq ($(strip $(APPTYPE)),staticLib)\r
-APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).a\r
-endif\r
-ifeq ($(strip $(APPTYPE)),sharedLib)\r
-APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).so\r
-endif\r
-\r
-ifneq ($(strip $(PLATFORM_INCS)),)\r
-PLATFORM_INCS_FILE := $(OBJ_OUTPUT)/platform_incs_file.inc\r
-endif\r
-\r
-include $(BUILD_ROOT)/build_c.mk\r
-\r
-\r
-ifeq ($(strip $(APPTYPE)),app)\r
-EXT_OP := -fPIE\r
-endif\r
-ifeq ($(strip $(APPTYPE)),staticLib)\r
-EXT_OP := -fPIE\r
-endif\r
-ifeq ($(strip $(APPTYPE)),sharedLib)\r
-EXT_OP := -fPIC\r
-endif\r
-\r
-C_OPT := $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) $(EXT_OP) --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) $(USER_C_OPTS)\r
-CPP_OPT := $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) $(EXT_OP) --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) $(USER_CPP_OPTS)\r
-C_OPT_FILE := $(PLATFORM_INCS_FILE)\r
-\r
-OBJS := #\r
-\r
-# Global C/C++\r
-ifeq ($(strip $(USER_ROOT)),)\r
-USER_ROOT := $(PROJ_ROOT)\r
-endif\r
-$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_SRCS),$(USER_INC_DIRS),$(USER_INC_FILES),$(USER_DEFS),$(USER_UNDEFS),$(C_OPT),$(C_OPT_FILE),C,c,$(CC),OBJS))\r
-$(foreach ext,cpp cxx cc c++ C,$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_SRCS),$(USER_INC_DIRS),$(USER_CPP_INC_FILES),$(USER_CPP_DEFS),$(USER_CPP_UNDEFS),$(CPP_OPT),$(C_OPT_FILE),C++,$(ext),$(CXX),OBJS)))\r
-\r
-# Individual C/C++\r
-ifneq ($(strip $(USER_EXT_C_KEYS)),)\r
-$(foreach var,$(USER_EXT_C_KEYS),$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_EXT_$(var)_SRCS),$(USER_EXT_$(var)_INC_DIRS),$(USER_EXT_$(var)_INC_FILES),$(USER_EXT_$(var)_DEFS),$(USER_EXT_$(var)_UNDEFS),$(C_OPT),$(C_OPT_FILE),C,c,$(CC),OBJS)))\r
-$(foreach ext,cpp cxx cc c++ C,$(foreach var,$(USER_EXT_C_KEYS),$(eval $(call C_PROC_RAW,$(OBJ_OUTPUT),$(USER_EXT_$(var)_SRCS),$(USER_EXT_$(var)_INC_DIRS),$(USER_EXT_$(var)_CPP_INC_FILES),$(USER_EXT_$(var)_CPP_DEFS),$(USER_EXT_$(var)_CPP_UNDEFS),$(CPP_OPT),$(C_OPT_FILE),C++,$(ext),$(CXX),OBJS))))\r
-endif\r
-\r
-\r
-ifneq ($(strip $(USER_LIB_DIRS)),)\r
-_ENC_USER_LIB_DIRS := $(call ENCODE_4MAKE,$(USER_LIB_DIRS))\r
-_ENC_USER_LIB_DIRS := $(addprefix -L,$(_ENC_USER_LIB_DIRS))\r
-LIBPATHS := $(call DECODE_4MAKE,$(_ENC_USER_LIB_DIRS))\r
-endif\r
-\r
-LIBS += $(addprefix -l,$(USER_LIBS))\r
-\r
-UOBJS += $(USER_OBJS)\r
-\r
-M_OPT = -MMD -MP -MF"$(@:%.o=%.d)"\r
-\r
-DEPS := $(OBJS:.o=.d)\r
-\r
-ifneq ($(strip $(DEPS)),)\r
--include $(PROJ_ROOT)/Build/$(DEPS)\r
-endif\r
-\r
-\r
-ifeq ($(strip $(APPTYPE)),app)\r
-$(APPFILE) : $(OBJS) $(UOBJS)\r
- @echo ' Building target: $@'\r
- @echo ' Invoking: C/C++ Linker'\r
- $(call MAKEDIRS,$(@D))\r
-# $(CXX) -o $(APPFILE) $(OBJS) $(UOBJS) $(LIBPATHS) -Xlinker --as-needed $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -pie -lpthread --sysroot="$(SYSROOT)" -Xlinker --version-script="$(PROJ_ROOT)/.exportMap" $(RS_LIB_PATHS) $(RS_LIBRARIES) -Xlinker -rpath='$$ORIGIN/../lib' -Werror-implicit-function-declaration $(USER_LINK_OPTS)\r
- $(CXX) -o $(APPFILE) $(OBJS) $(UOBJS) $(LIBPATHS) -Xlinker $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -pie -lpthread --sysroot="$(SYSROOT)" -Xlinker --version-script="$(PROJ_ROOT)/.exportMap" $(RS_LIB_PATHS) $(RS_LIBRARIES) -Xlinker -rpath='$$ORIGIN/../lib' -Werror-implicit-function-declaration $(USER_LINK_OPTS)\r
- @echo ' Finished building target: $@'\r
-endif\r
-ifeq ($(strip $(APPTYPE)),staticLib)\r
-$(APPFILE) : $(OBJS) $(UOBJS)\r
- @echo ' Building target: $@'\r
- @echo ' Invoking: Archive utility'\r
- $(call MAKEDIRS,$(@D))\r
- $(AR) -r $(APPFILE) $(OBJS) $(UOBJS) $(AR_FLAGS) $(USER_LINK_OPTS)\r
- @echo ' Finished building target: $@'\r
-endif\r
-ifeq ($(strip $(APPTYPE)),sharedLib)\r
-$(APPFILE) : $(OBJS) $(UOBJS)\r
- @echo ' Building target: $@'\r
- @echo ' Invoking: C/C++ Linker'\r
- $(call MAKEDIRS,$(@D))\r
- $(CXX) -o $(APPFILE) $(OBJS) $(UOBJS) $(LIBPATHS) -Xlinker --as-needed $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -shared -lpthread --sysroot="$(SYSROOT)" $(RS_LIB_PATHS) $(RS_LIBRARIES) $(USER_LINK_OPTS)\r
- @echo ' Finished building target: $@'\r
-endif\r
-\r
-\r
-$(OBJ_OUTPUT) :\r
- $(call MAKEDIRS,$@)\r
-\r
-$(OUTPUT_DIR) :\r
- $(call MAKEDIRS,$@)\r
-\r
-\r
-#ifneq ($(strip $(PLATFORM_INCS)),)\r
-#$(PLATFORM_INCS_FILE) : $(OBJ_OUTPUT)\r
-# @echo ' Building inc file: $@'\r
-#ifneq ($(findstring Windows,$(OS)),)\r
-#ifneq ($(findstring 3.82,$(MAKE_VERSION)),)\r
-# $(file > $@,$(PLATFORM_INCS))\r
-#else\r
-# @echo $(PLATFORM_INCS) > $@\r
-#endif\r
-#else\r
-# @echo '$(PLATFORM_INCS)' > $@\r
-#endif\r
-#endif\r
-\r
-\r
-include $(BUILD_ROOT)/build_edc.mk\r
-\r
-#ifeq ($(strip $(ENVENTOR_SHARED_RES_PATH)),)\r
-ENVENTOR_SHARED_RES_PATH ?= $(ENVENTOR_PATH)/share/enventor\r
-#endif\r
-\r
-EDJ_FILES :=\r
-\r
-# Global EDCs\r
-ifneq ($(strip $(USER_EDCS)),)\r
-$(eval $(call EDJ_PROC_RAW,$(OUTPUT_DIR),$(USER_EDCS),$(USER_EDCS_IMAGE_DIRS),$(USER_EDCS_SOUND_DIRS),$(USER_EDCS_FONT_DIRS),EDJ_FILES))\r
-endif\r
-\r
-# Individual EDCs\r
-ifneq ($(strip $(USER_EXT_EDC_KEYS)),)\r
-$(foreach var,$(USER_EXT_EDC_KEYS),$(eval $(call EDJ_PROC_RAW,$(OUTPUT_DIR),$(USER_EXT_$(var)_EDCS),$(USER_EXT_$(var)_EDCS_IMAGE_DIRS),$(USER_EXT_$(var)_EDCS_SOUND_DIRS),$(USER_EXT_$(var)_EDCS_FONT_DIRS),EDJ_FILES)))\r
-endif\r
-\r
-\r
-include $(BUILD_ROOT)/build_po.mk\r
-\r
-MO_FILES :=\r
-\r
-# Global POs\r
-ifneq ($(strip $(USER_POS)),)\r
-$(eval $(call MO_PROC_RAW,$(OUTPUT_DIR),$(USER_POS),$(APPID2),MO_FILES))\r
-endif\r
-\r
-\r
-secondary-outputs : $(EDJ_FILES) $(MO_FILES)\r
-\r
--include appendix.mk\r
-\r
-app_build : $(OUTPUT_DIR) $(APPFILE) secondary-outputs\r
- @echo ========= done =========\r
-\r
-\r
-app_clean :\r
- rm -f $(APPFILE)\r
- rm -rf $(OUTPUT_DIR)\r
-\r
-build_version :\r
- @echo makefile.mk : $(BUILD_SCRIPT_VERSION)\r
+++ /dev/null
-# Add inputs and outputs from these tool invocations to the build variables\r
-\r
-SYSROOT = $(SBI_SYSROOT)\r
-\r
-#USR_INCS := $(addprefix -I "$(SYSROOT),$(PLATFORM_INCS_EX))\r
-USR_INCS1 := $(addsuffix ",$(PLATFORM_INCS_EX))\r
-USR_INCS := $(addprefix -I "$(SYSROOT),$(USR_INCS1))\r
-\r
-ifeq ($(strip $(PLATFORM_LIB_PATHS)),)\r
-RS_LIB_PATHS := "$(SYSROOT)/usr/lib"\r
-else\r
-RS_LIB_PATHS1 := $(addsuffix ",$(PLATFORM_LIB_PATHS))\r
-RS_LIB_PATHS := $(addprefix -L "$(SYSROOT),$(RS_LIB_PATHS1))\r
-endif\r
-\r
-RS_LIBRARIES := $(addprefix -l,$(RS_LIBRARIES_EX))\r
-\r
-PLATFORM_INCS = $(USR_INCS) -I "$(SDK_PATH)/library"\r
+++ /dev/null
-# Add inputs and outputs from these tool invocations to the build variables\r
-\r
-ifneq ($(strip $(SHELL_BIN)),)\r
-SHELL = $(SHELL_BIN)\r
-else\r
-SHELL = sh\r
-endif\r
-\r
-ifneq ($(strip $(MKDIR_BIN)),)\r
-MKDIR = $(MKDIR_BIN)\r
-MKDIR_OP = -p\r
-else\r
-MKDIR = mkdir\r
-MKDIR_OP = -p\r
-endif\r
-\r
-ifneq ($(strip $(UNAME_BIN)),)\r
-UNAME = $(UNAME_BIN)\r
-else\r
-UNAME = uname\r
-endif\r
-\r
-ifneq ($(strip $(M4_BIN)),)\r
-M4 = $(M4_BIN)\r
-else\r
-M4 = m4\r
-endif\r
-\r
-ifneq ($(strip $(TR_BIN)),)\r
-TR = $(TR_BIN)\r
-else\r
-TR = tr\r
-endif\r
-\r
-ifneq ($(strip $(FIND_BIN)),)\r
-FIND = $(FIND_BIN)\r
-else\r
-FIND = find\r
-endif\r
-\r
-ifneq ($(strip $(SED_BIN)),)\r
-SED = $(SED_BIN)\r
-else\r
-SED = sed\r
-endif\r
-\r
-ifneq ($(strip $(GREP_BIN)),)\r
-GREP = $(GREP_BIN)\r
-else\r
-GREP = grep\r
-endif\r
-\r
-ifneq ($(strip $(EDJE_CC_BIN)),)\r
-EDJE_CC = $(EDJE_CC_BIN)\r
-else\r
-EDJE_CC = edje_cc\r
-endif\r
-\r
-ifneq ($(strip $(MSGFMT_BIN)),)\r
-MSGFMT = $(MSGFMT_BIN)\r
-else\r
-MSGFMT = msgfmt\r
-endif\r
-\r
-ifneq ($(strip $(CKSUM_BIN)),)\r
-CKSUM = $(CKSUM_BIN)\r
-else\r
-CKSUM = cksum\r
-endif\r
-\r
SET(${fw_name}_CXXFLAGS "-Wall -Werror -std=c++11 -fPIC -Wl,-z,relro -fstack-protector -DEFL_BETA_API_SUPPORT")
-SET(dependents "gstreamer-1.0 dlog gstreamer-ffsubtitle-1.0"
- "boost"
- "context-aware-api"
- "libtzplatform-config"
- "drmdecrypt"
- "logger")
+SET(dependents "gstreamer-1.0 dlog"
+ "boost"
+ "libtzplatform-config")
INCLUDE(FindPkgConfig)
${PROJECT_SOURCE_DIR}/src/gst_utils.cpp
${PROJECT_SOURCE_DIR}/src/error.cpp
${PROJECT_SOURCE_DIR}/src/serializer.cpp
- ${PROJECT_SOURCE_DIR}/src/subtitle_attr_parser.cpp
${PROJECT_SOURCE_DIR}/src/plusplayer_cfg.cpp
${PROJECT_SOURCE_DIR}/src/trackrendereradapter.cpp
${PROJECT_SOURCE_DIR}/src/trackrendereradapter_utils.cpp
- ${PROJECT_SOURCE_DIR}/src/kpi.cpp
- ${PROJECT_SOURCE_DIR}/src/decodedvideopacketex.cpp
- ${PROJECT_SOURCE_DIR}/src/videoframetypestrategy.cpp
- ${PROJECT_SOURCE_DIR}/src/base64.cpp
- ${PROJECT_SOURCE_DIR}/src/caf_logger.cpp
)
ADD_LIBRARY(${fw_name} SHARED ${CC_SRCS})
+++ /dev/null
-\r
-# Add pre/post build process\r
-PREBUILD_DESC = \r
-PREBUILD_COMMAND = \r
-POSTBUILD_DESC = \r
-POSTBUILD_COMMAND =
\ No newline at end of file
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-
-#ifndef __PLUSPLAYER_SRC_CORE_DECODED_RAW_MODE_PACKET_H__
-#define __PLUSPLAYER_SRC_CORE_DECODED_RAW_MODE_PACKET_H__
-
-#include <tbm_type_common.h>
-
-namespace plusplayer {
-
-enum class DecodedVideoRawModePacketType { kPhysicalAddress, kTizenBuffer };
-
-struct DecodedVideoRawModePacketRawData {
- int y_phyaddr = 0;
- int y_viraddr = 0;
- int y_linesize = 0;
- int uv_phyaddr = 0;
- int uv_viraddr = 0;
- int uv_linesize = 0;
-};
-struct DecodedVideoRawModePacketTBMData {
- tbm_key key;
-};
-
-struct DecodedVideoRawModePacket {
- DecodedVideoRawModePacketType type =
- DecodedVideoRawModePacketType::kPhysicalAddress;
- uint64_t pts = 0;
- uint32_t width = 0;
- uint32_t height = 0;
- union Data {
- DecodedVideoRawModePacketRawData raw;
- DecodedVideoRawModePacketTBMData tbm;
- } data = {.tbm = {0}};
-};
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_SRC_CORE_DECODED_RAW_MODE_PACKET_H__
\ No newline at end of file
#include "gst/gst.h"
// temporary until drmdecrypt platform interfaces are added into rootstrap
#ifndef PLUPLAYER_DOWNLOADABLE_APP_TVPLUS
-#include <drmdecrypt/drmdecrypt_api.h>
#endif
#include "plusplayer/track.h"
static Ptr Create(const TrackType type = kTrackTypeMax,
const int index = kInvalidTrackIndex,
- GstBuffer* buffer = nullptr) {
- return Ptr(new DecoderInputBuffer(buffer, type, index));
+ GstBuffer* buffer = nullptr,
+ GstCaps* caps = nullptr) {
+ return Ptr(new DecoderInputBuffer(buffer, type, index, caps));
}
DecoderInputBuffer() = delete;
std::memory_order_acquire))
; // spin until the lock is acquired
if (buffer_) {
- ReleaseTZHandle_(buffer_);
gst_buffer_unref(buffer_);
}
+
+ if (caps_)
+ gst_caps_unref(caps_);
std::atomic_flag_clear_explicit(&buffer_lock_, std::memory_order_release);
}
const bool IsEos() const { return is_eos_; }
+ const GstCaps* GetCaps() const { return caps_; }
+
GstBuffer* Release() {
while (std::atomic_flag_test_and_set_explicit(&buffer_lock_,
std::memory_order_acquire))
private:
explicit DecoderInputBuffer(GstBuffer* buffer, const TrackType type,
- const int index)
+ const int index, GstCaps *caps)
: type_(type), index_(index) {
if (buffer) {
buffer_ = gst_buffer_ref(buffer);
duration_ = GST_TIME_AS_MSECONDS(GST_BUFFER_DURATION(buffer_));
+ if (caps)
+ caps_ = gst_caps_ref(caps);
if (type == kTrackTypeSubtitle) {
GstMapInfo info;
gst_buffer_map(buffer_, &info, GST_MAP_READ);
}
}
- void ReleaseTZHandle_(GstBuffer* buffer) {
-#ifndef PLUPLAYER_DOWNLOADABLE_APP_TVPLUS
- GstStructure* tzqdata = GST_STRUCTURE(gst_mini_object_get_qdata(
- GST_MINI_OBJECT(buffer),
- g_quark_from_static_string("GstTzHandleData")));
-
- if (tzqdata) {
- gboolean ret = FALSE;
- guint packet_handle = 0;
- guint packet_size = 0;
- handle_and_size_s ret_Handle;
- memset(&ret_Handle, 0, sizeof(ret_Handle));
-
- ret = gst_structure_get_uint(tzqdata, "packet_handle", &packet_handle);
- if (FALSE == ret) {
- return;
- }
-
- ret = gst_structure_get_uint(tzqdata, "packet_size", &packet_size);
- if (FALSE == ret) {
- return;
- }
-
- ret_Handle.handle = packet_handle;
- ret_Handle.size = packet_size;
- release_handle(&ret_Handle);
- }
-#endif
- }
-
private:
std::atomic_flag buffer_lock_ = ATOMIC_FLAG_INIT;
const TrackType type_ = kTrackTypeMax;
GstBuffer* buffer_ = nullptr;
uint32_t buffer_size_ = 0;
uint64_t duration_ = 0;
+ GstCaps * caps_ = nullptr;
const uint8_t* raw_data_ = nullptr;
};
void SetGstStateToNull(GstElement* pipeline, void* id = nullptr);
const gchar* GetElementName(const GstMessage* msg);
const gchar* GetKlass(const GstMessage* msg);
+GstElement* MakeElement(GstCaps * caps, GstElementFactoryListType type);
+GstElement* MakeCapsFilter(GstPad * pad, GstElementFactoryListType type, const char* klass_keyword);
+char** GetCookieList(const char* cookies);
} // namespace gst_util
+++ /dev/null
-//
-// @ Copyright [2017] <S/W Platform, Visual Display, Samsung Electronics>
-//
-
-#ifndef __PLUSPLAYER_SRC_CORE_KPI_H__
-#define __PLUSPLAYER_SRC_CORE_KPI_H__
-
-#include <string>
-
-#include "plusplayer/drm.h"
-#include "plusplayer/types/source.h"
-
-namespace plusplayer {
-
-namespace kpi {
-
-struct CodecLoggerKeys {
- SourceType src_type = SourceType::kNone;
- drm::Type drm_type = drm::Type::kNone;
- std::string container_type;
- int v_decoder_type = 0; /**< (0:DEFAULT, 1:HW, 2:SW, 3:DISABLE) */
- std::string v_codec;
- unsigned int v_tag = 0;
- int width = 0;
- int height = 0;
- int a_decoder_type = 0; /**< (0:DEFAULT, 1:HW, 2:SW, 3:DISABLE) */
- std::string a_codec;
- unsigned int a_tag = 0;
- std::string app_id;
-};
-
-struct EsCodecLoggerKeys {
- std::string app_id;
- bool is_clean = true; /**< (false:EME, true:MSE) */
- int width = 0;
- int height = 0;
- std::string v_codec;
- int v_codec_version;
- std::string a_codec;
-};
-
-
-class CodecLogger {
- public:
- CodecLogger() {};
- ~CodecLogger() {};
-
- bool SendKpi(bool event_case, const CodecLoggerKeys& keys);
- bool SendKpi(bool event_case, const EsCodecLoggerKeys& keys);
- private:
- bool SendKpi_(bool event_case, const std::stringstream& message);
-};
-
-} // namespace kpi
-
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_SRC_CORE_KPI_H__
\ No newline at end of file
#include <memory>
#include <vector>
-#include "core/decodedvideorawmodepacket.h"
#include "core/decoderinputbuffer.h"
-#include "core/videoframetypestrategy.h"
#include "plusplayer/appinfo.h"
-#include "plusplayer/audioeasinginfo.h"
#include "plusplayer/drm.h"
#include "plusplayer/track.h"
#include "plusplayer/types/buffer.h"
#include "plusplayer/types/display.h"
#include "plusplayer/types/error.h"
#include "plusplayer/types/event.h"
-#include "plusplayer/types/latency.h"
-#include "plusplayer/types/picturequality.h"
-#include "plusplayer/types/resource.h"
#include "plusplayer/types/stream.h"
namespace plusplayer {
kAudioQueueCurrentLevelByte, // std::uint64_t
kVideoMinByteThreshold, // std::uint32_t
kAudioMinByteThreshold, // std::uint32_t
+ kVideoQueueMaxBuffer, // std::uint64_t
+ kAudioQueueMaxBuffer, // std::uint64_t
+#if 0
kVideoQueueMaxTime, // std::uint64_t
kAudioQueueMaxTime, // std::uint64_t
kVideoQueueCurrentLevelTime, // std::uint64_t
kVideoSupportRotation, // std::unit32_t
kVideoRenderTimeOffset, // std::int64_t
kAudioRenderTimeOffset, // std::int64_t
+#endif
/*attributes for trackrenderer configures*/
kVideoPreDisplayMode, // std::uint32_t
kStartRenderingTime, // std::uint64_t
kFmmMode, // std::uint32_t
+#if 0
kAlternativeVideoResource, // std::uint32_t
kVideoDecodingMode, // std::uint32_t
kLateVideoFrameDropMode, // std::uint32_t
-
+#endif
};
// TODO(js4716.chun):CHECK POINTS
public:
virtual ~EventListener() {}
virtual void OnError(const ErrorType& err_code) {}
- virtual void OnErrorMsg(const ErrorType& error_code, char* error_msg) {}
virtual void OnResourceConflicted() {}
virtual void OnSeekDone() {}
virtual void OnEos() {}
virtual void OnBufferStatus(const TrackType& type,
const BufferStatus& status) {}
virtual void OnSeekData(const TrackType& type, const uint64_t offset) {}
- virtual void OnMediaPacketGetTbmBufPtr(void** tbm_ptr,
- bool is_scale_change) {}
virtual void OnMediaPacketVideoDecoded(const DecodedVideoPacket& packet) {}
- virtual void OnMediaPacketVideoRawDecoded(
- const DecodedVideoRawModePacket& packet) {}
virtual void OnFlushDone() {}
virtual void OnFirstDecodingDone() {}
- virtual void OnVideoDecoderUnderrun() {}
- virtual void OnVideoLatencyStatus(const LatencyStatus& latency_status) {}
- virtual void OnAudioLatencyStatus(const LatencyStatus& latency_status) {}
- virtual void OnVideoHighLatency() {}
- virtual void OnAudioHighLatency() {}
- virtual void OnMultiviewStartVideo() {}
- virtual void OnMultiviewStopVideo() {}
};
public:
bool Resume();
bool SetTrack(const std::vector<Track>& trackinfo);
void SetIniProperty(const std::map<std::string, bool>& Properties);
+ void SetIniElement(const std::map<std::string, std::string>& elements);
bool Seek(uint64_t time_millisecond, double playback_rate);
bool Seek(uint64_t time_millisecond, double playback_rate, bool audio_mute);
bool SetPlaybackRate(double playback_rate, bool audio_mute);
bool GetPlayingTime(uint64_t* curtime_in_msec);
bool GetDroppedFrames(void* counts);
- bool GetDroppedFramesForCatchup(TrackType type, void* counts);
bool Deactivate(TrackType type);
bool Activate(TrackType type, const Track& track);
bool SubmitPacket(const DecoderInputBufferPtr& data);
bool SubmitPacket2(const DecoderInputBufferPtr& data, SubmitStatus* status);
void SetDrm(const drm::Property& drm_property);
void DrmLicenseAcquiredDone(TrackType type);
+ void SetDrmLicenseKey(TrackType type, const std::string& key);
bool SetDisplayMode(const DisplayMode& mode);
bool SetDisplayRotate(const DisplayRotation& rotate);
bool GetDisplayRotate(DisplayRotation* rotate);
bool SetDisplay(const DisplayType& type, void* obj);
bool SetDisplay(const DisplayType& type, void* ecore_wl2_window, int x, int y,
int w, int h);
- bool SetDisplaySubsurface(const DisplayType& type, void* ecore_wl2_subsurface,
- int x, int y, int w, int h);
bool SetDisplayRoi(const Geometry& roi);
bool SetVideoRoi(const CropArea& area);
- bool ResizeRenderRect(const RenderRect& rect);
bool SetDisplayVisible(bool is_visible);
void GetDisplay(DisplayType* type, Geometry* area);
void GetDisplayMode(DisplayMode* mode);
bool SetAudioMute(bool is_mute);
bool SetVolume(const int& volume);
bool GetVolume(int* volume);
- bool SetCatchUpSpeed(const CatchUpSpeed& level);
- bool GetVideoLatencyStatus(LatencyStatus* status);
- bool GetAudioLatencyStatus(LatencyStatus* status);
void RegisterListener(EventListener* listener);
void RegisterListenerForEsplayer(EventListener* listener);
void SetAttribute(const Attribute& attr, const boost::any& value);
TrackRendererState GetState();
bool SetMatroskaColorInfo(const std::string& color_info);
- void SetVideoFrameBufferType(VideoFrameTypeStrategyPtr strategy);
- bool SetVideoFrameBufferScaleResolution(const uint32_t& target_width,
- const uint32_t& target_height);
- bool SetDecodedVideoFrameRate(const Rational& request_framerate);
+ void SetVideoFrameBufferType(const DecodedVideoFrameBufferType& type);
bool Flush(const StreamType& type);
bool Flush(const TrackType& type);
void GetAttribute(const Attribute& attr, boost::any* value);
bool RenderVideoFrame();
- bool SetAiFilter(void* aifilter);
- bool SetVideoMidLatencyThreshold(const unsigned int threshold);
- bool SetAudioMidLatencyThreshold(const unsigned int threshold);
- bool SetVideoHighLatencyThreshold(const unsigned int threshold);
- bool SetAudioHighLatencyThreshold(const unsigned int threshold);
- bool InitAudioEasingInfo(const uint32_t init_volume,
- const uint32_t init_elapsed_time,
- const AudioEasingInfo& easing_info);
- bool UpdateAudioEasingInfo(const AudioEasingInfo& easing_info);
- bool GetAudioEasingInfo(uint32_t* current_volume, uint32_t* elapsed_time,
- AudioEasingInfo* easing_info);
- bool StartAudioEasing();
- bool StopAudioEasing();
- bool GetVirtualRscId(const RscType type, int* virtual_id);
- bool SetAdvancedPictureQualityType(const AdvPictureQualityType type);
- bool SetResourceAllocatePolicy(const RscAllocPolicy policy);
- bool SetVideoParDar(uint64_t time_millisecond, uint32_t par_num,
- uint32_t par_den, uint32_t dar_num, uint32_t dar_den);
private:
TrackRendererAdapter();
using UserData = void*;
static void ErrorCb_(const TrackRendererErrorType error_code,
UserData userdata);
- static void ErrorMsgCb_(const TrackRendererErrorType error_code,
- char* error_msg, UserData userdata);
static void ResourceConflictCb_(UserData userdata);
static void SeekDoneCb_(UserData userdata);
static void SeekDataCb_(const TrackRendererTrackType type,
const uint64_t offset, UserData userdata);
- static void MediaPacketGetTbmBufPtrCb_(void** ptr, bool is_scale_change,
- UserData userdata);
-
static void MediaPacketVideoDecodedCb_(
const TrackRendererDecodedVideoPacket* packet, UserData userdata);
- static void MediaPacketVideoRawDecodedCb_(
- const TrackRendererDecodedVideoRawModePacket* packet,
- TrackRendererDecodedVideoType type, UserData userdata);
-
- static void VideoDecoderUnderrunCb_(UserData userdata);
- static void VideoLatencyStatusCb_(
- const TrackRendererLatencyStatus latency_status, UserData userdata);
- static void AudioLatencyStatusCb_(
- const TrackRendererLatencyStatus latency_status, UserData userdata);
- static void VideoHighLatencyCb_(UserData userdata);
- static void AudioHighLatencyCb_(UserData userdata);
- static void MultiviewStartVideoCb_(UserData userdata);
- static void MultiviewStopVideoCb_(UserData userdata);
-
private:
using TrackRendererHandle = void*;
TrackRendererHandle handle_ = nullptr;
#include <cassert>
#include "plusplayer/appinfo.h"
-#include "plusplayer/audioeasinginfo.h"
#include "plusplayer/drm.h"
#include "plusplayer/track.h"
#include "plusplayer/types/buffer.h"
#include "plusplayer/types/display.h"
#include "plusplayer/types/error.h"
-#include "plusplayer/types/latency.h"
-#include "plusplayer/types/picturequality.h"
-#include "plusplayer/types/resource.h"
#include "plusplayer/types/stream.h"
#include "trackrenderer_capi/buffer.h"
#include "trackrenderer_capi/decoderinputbuffer.h"
#include "trackrenderer_capi/display.h"
#include "trackrenderer_capi/drm.h"
#include "trackrenderer_capi/error.h"
-#include "trackrenderer_capi/latency.h"
#include "trackrenderer_capi/track.h"
#include "trackrenderer_capi/trackrenderer_capi.h"
const Geometry& roi);
void MakeTrackRendererCropArea(TrackRendererCropArea* crop,
const CropArea& area);
-void MakeTrackRendererRenderRect(TrackRendererRenderRect* output,
- const RenderRect& input);
void MakeTrackRendererTrack(TrackRendererTrack* track, const Track& trackinfo);
void MakeTrackRendererAppInfo(TrackRendererAppInfo* app_attr,
const PlayerAppInfo& app_info);
-void MakeTrackRendererAudioEasingInfo(TrackRendererAudioEasingInfo* easing_attr,
- const AudioEasingInfo& easing_info);
-void MakeAudioEasingInfo(AudioEasingInfo* easing_info,
- const TrackRendererAudioEasingInfo& easing_attr);
-void MakeTrackRendererRational(TrackRendererRational* rational_attr,
- const Rational& rational_info);
+
DisplayMode ConvertToDisplayMode(TrackRendererDisplayMode typevalue);
DisplayType ConvertToDisplayType(const TrackRendererDisplayType typevalue);
ErrorType ConvertToErrorType(const TrackRendererErrorType type);
TrackRendererTrackType ConvertToTrackRendererTrackType(const TrackType& type);
TrackRendererTrackType ConvertToTrackRendererTrackTypeFromStreamType(
const StreamType& type);
-TrackRendererCatchUpSpeed ConvertToTrackRendererCatchUpSpeed(
- const CatchUpSpeed& level);
-LatencyStatus ConvertToLatencyStatus(const TrackRendererLatencyStatus& status);
#ifndef TRACKRENDERER_FEATURE_DEPRECATE_SUBTITLE_CB
boost::any SetSubtitleAttrValue(const TrackRendererSubtitleAttr& value);
#endif
BufferStatus ConvertToBufferStatus(const TrackRendererBufferStatus& status);
-AudioEasingType ConvertToAudioEasingType(
- const TrackRendererAudioEasingType& type);
-TrackRendererAudioEasingType ConvertToTrackRendererAudioEasingType(
- const AudioEasingType& type);
-bool ConvertToTrackRendererRscType(const RscType& typevalue,
- TrackRendererRscType* type);
-bool ConvertToTrackRendererAdvPictureQualityType(
- const AdvPictureQualityType& typevalue,
- TrackRendererAdvPictureQualityType* type);
-bool ConvertToTrackRendererRscAllocPolicy(const RscAllocPolicy& policyvalue,
- TrackRendererRscAllocPolicy* policy);
} // namespace adapter_utils
} // namespace plusplayer
+++ /dev/null
-//\r
-// @ Copyright [2020] <S/W Platform,Visual Display,Samsung Electronics>\r
-//\r
-\r
-#ifndef __PLUSPLAYER_SRC_BASE64_H__\r
-#define __PLUSPLAYER_SRC_BASE64_H__\r
-\r
-#include <iostream>\r
-#include <map>\r
-#include <string>\r
-#include "core/utils/plusplayer_log.h"\r
-\r
-namespace plusplayer {\r
-namespace base64 {\r
-std::string Base64Encode(const char *str, const int size);\r
-\r
-std::string Base64Decode(const std::string str);\r
-} // namespace base64\r
-\r
-} // namespace plusplayer\r
-\r
-#endif // __PLUSPLAYER_SRC_BASE64_H__\r
+++ /dev/null
-#ifndef _AVPLAY_CAF_LOGGER_H__\r
-#define _AVPLAY_CAF_LOGGER_H__\r
-\r
-#include <mutex>\r
-#include <queue>\r
-#include <string>\r
-#include <utility>\r
-#include <vector>\r
-#include <future>\r
-#include <map>\r
-#include <boost/core/noncopyable.hpp>\r
-#include <list>\r
-\r
-namespace plusplayer {\r
-\r
- enum class CafEventType {\r
- kNone = 0,\r
- kStart,\r
- kEnd,\r
- kBitrate,\r
- kBuffering,\r
- kResolution, \r
- kStreamReady,\r
- kIdle,\r
- kReady,\r
- kPlaying,\r
- kPaused,\r
- kEventMax\r
- };\r
-\r
- typedef struct _CafEventData {\r
- CafEventType event_type;\r
- std::string event_data;\r
- }CafEventData;\r
-\r
- class ContextAware {\r
- public:\r
- ContextAware() {} \r
- ~ContextAware() {}\r
- bool InitService(); \r
- void Write(std::string json_data);\r
- bool FiniService();\r
- };\r
-\r
- class CafLogger {\r
- private:\r
- static CafLogger *instance_;\r
- static std::shared_ptr<ContextAware> context_aware_;\r
- \r
- std::mutex object_lock_;\r
- bool connected_to_dbus_;\r
- bool msg_thread_stopped_;\r
- std::queue<CafEventData> msg_queue_;\r
- std::mutex msg_task_mutex_;\r
- std::condition_variable msg_task_cv_; \r
- std::future<void> msg_handler_task_;\r
- std::string app_id_;\r
- int unique_number;\r
- std::queue<int> using_instance_;\r
-\r
- CafLogger();\r
- std::string GetEventStrName_(CafEventType event_type);\r
- std::string GetEventValueStrName_(CafEventType event_type);\r
- std::string GetStateValueStrName_(CafEventType event_type);\r
- void SendData_(CafEventData event);\r
- void MsgTask_();\r
- void StartMsgThread_();\r
- void StopMsgThread_();\r
- bool PushMessageToQueue_(CafEventType event_type, std::string data);\r
- bool isConnected_();\r
- bool Connect_();\r
- bool Disconnect_();\r
- void setAppId_(std::string app_id);\r
- void setUniqueNumber_(int uniqueNumber);\r
- int getUniqueNumber_();\r
- \r
- public:\r
- static bool Initialize();\r
- static bool LogMessage(CafEventType event_type, std::string data);\r
- static void StartLoggingThread();\r
- static void StopLoggingThread();\r
- static void SetAppId(std::string app_id);\r
- static void SetUniqueNumber();\r
- static std::string GetUniqueNumber();\r
- static void SetContextAware(std::shared_ptr<ContextAware>&& context_aware);\r
- ~CafLogger();\r
- };\r
-\r
-} //plusplayer\r
-\r
-#endif //_AVPLAY_CAF_LOGGER_H__\r
if(strlen(arg) < (kBufSize - strlen(prefix_str))) {
use_arg = true;
}
- }
+ }
snprintf(buf, kBufSize, "%s %s",prefix_str, (use_arg? arg : ""));
prctl(PR_TASK_PERF_USER_TRACE, buf, strlen(buf));
}
namespace plusplayer {
namespace plusplayer_cfg {
-
+
const char* GetIniPath();
} // namespace plusplayer_cfg
} while (0); \
})
+#define SECURE_LOG_DEBUG(fmt, arg...) \
+({ \
+ do { \
+ SECURE_LOGD(fmt,##arg); \
+ } while (0); \
+})
+
#define LOG_ENTER \
{ \
do { \
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-
-#ifndef __PLUSPLAYER_SRC_CORE_VIDEO_FRAME_TYPE_STRATEGY_H__
-#define __PLUSPLAYER_SRC_CORE_VIDEO_FRAME_TYPE_STRATEGY_H__
-
-#include <memory>
-
-#include "plusplayer/types/buffer.h"
-
-namespace plusplayer {
-struct VideoFrameTypeStrategy {
- using TrackRendererHandle = void*;
- virtual ~VideoFrameTypeStrategy() = default;
- virtual void SetType(TrackRendererHandle handle) = 0;
-};
-
-using VideoFrameTypeStrategyPtr = std::unique_ptr<VideoFrameTypeStrategy>;
-
-class DefaultVideoFrameTypeStrategy : public virtual VideoFrameTypeStrategy {
- public:
- explicit DefaultVideoFrameTypeStrategy(
- const DecodedVideoFrameBufferType type);
- virtual ~DefaultVideoFrameTypeStrategy() = default;
- virtual void SetType(TrackRendererHandle handle) override;
-
- private:
- const DecodedVideoFrameBufferType type_;
-};
-
-class RawVideoFrameTypeStrategy : public virtual VideoFrameTypeStrategy {
- public:
- explicit RawVideoFrameTypeStrategy() = default;
- virtual ~RawVideoFrameTypeStrategy() = default;
- virtual void SetType(TrackRendererHandle handle);
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_SRC_CORE_VIDEO_FRAME_TYPE_STRATEGY_H__
\ No newline at end of file
+++ /dev/null
-\r
-# Project Name\r
-APPNAME = plusplayercore_tvplus\r
-\r
-# Project Type\r
-type = sharedLib\r
-\r
-# Project Profile\r
-profile = tv-samsung-5.0\r
-\r
-# C/CPP Sources\r
-USER_SRCS = src/decoderinputbuffer.cpp src/error.cpp src/gstobject_guard.cpp src/gstsignal_holder.cpp src/gst_utils.cpp src/plusplayer_cfg.cpp src/serializer.cpp src/subtitle_attr_parser.cpp src/trackrendereradapter.cpp src/trackrendereradapter_utils.cpp src/track_util.cpp \r
-\r
-# EDC Sources\r
-USER_EDCS = \r
-\r
-# PO Sources\r
-USER_POS = \r
-\r
-# User Defines\r
-USER_DEFS = \r
-USER_CPP_DEFS = TIZEN_DEPRECATION DEPRECATION_WARNING \r
-\r
-# User Undefines\r
-USER_UNDEFS = \r
-USER_CPP_UNDEFS = \r
-\r
-# User Libraries\r
-USER_LIBS = gstsubtitle_tvplus\r
-\r
-# User Objects\r
-USER_OBJS = \r
-\r
-# User Includes\r
-## C Compiler\r
-USER_C_INC_DIRS = \r
-USER_INC_FILES = \r
-## C++ Compiler\r
-USER_CPP_INC_DIRS = include_internal ../../include ../../../gst-plugins-subtitleparser/subtitle/include_internal\r
-USER_CPP_INC_FILES = \r
-\r
-USER_INC_DIRS = $(USER_C_INC_DIRS) $(USER_CPP_INC_DIRS)\r
-\r
-# User Library Path\r
-USER_LIB_DIRS = ../../../gst-plugins-subtitleparser/subtitle/${BUILD_CONFIG} \r
-\r
-# EDC Resource Path\r
-USER_EDCS_IMAGE_DIRS = ${OUTPUT_DIR} \r
-USER_EDCS_SOUND_DIRS = ${OUTPUT_DIR} \r
-USER_EDCS_FONT_DIRS = ${OUTPUT_DIR} \r
-\r
-# EDC Flags\r
-USER_EXT_EDC_KEYS = \r
-\r
-# Resource Filter\r
-USER_RES_INCLUDE = \r
-USER_RES_EXCLUDE = \r
-\r
+++ /dev/null
-//\r
-// @ Copyright [2020] <S/W Platform,Visual Display,Samsung Electronics>\r
-//\r
-\r
-#ifndef __PLUSPLAYER_SRC_BASE64_H__\r
-#define __PLUSPLAYER_SRC_BASE64_H__\r
-\r
-#include <iostream>\r
-#include <map>\r
-#include <string>\r
-#include "core/kpi.h"\r
-#include "core/utils/plusplayer_log.h"\r
-\r
-namespace plusplayer {\r
- namespace base64 {\r
-std::string Base64Encode(const char *str, const int size) {\r
- LOG_ENTER\r
- static const std::string sBase64Table =\r
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\r
- static const char cFillChar = '=';\r
- std::string sResult;\r
-\r
- // Allocate memory for the converted string\r
- sResult.reserve(size * 8 / 6 + 1);\r
-\r
- for (int nPos = 0; nPos < size; nPos++) {\r
- char cCode = (str[nPos] >> 2) & 0x3F;\r
- // Encode the first 6 bits\r
- sResult.append(1, sBase64Table[cCode]);\r
- // Encode the remaining 2 bits with the next 4 bits (if present)\r
- cCode = (str[nPos] << 4) & 0x3F;\r
-\r
- if (++nPos < size) {\r
- cCode |= (str[nPos] >> 4) & 0x0F;\r
- }\r
-\r
- sResult.append(1, sBase64Table[cCode]);\r
-\r
- if (nPos < size) {\r
- cCode = (str[nPos] << 2) & 0x3F;\r
-\r
- if (++nPos < size) {\r
- cCode |= (str[nPos] >> 6) & 0x03;\r
- }\r
-\r
- sResult.append(1, sBase64Table[cCode]);\r
- } else {\r
- ++nPos;\r
- sResult.append(1, cFillChar);\r
- }\r
-\r
- if (nPos < size) {\r
- cCode = str[nPos] & 0x3F;\r
- sResult.append(1, sBase64Table[cCode]);\r
- } else {\r
- sResult.append(1, cFillChar);\r
- }\r
- }\r
-\r
- LOG_INFO("Base64Encode output str %s", sResult.c_str());\r
- LOG_LEAVE\r
-\r
- return sResult;\r
-}\r
-\r
-std::string Base64Decode(const std::string str) {\r
- // LOG_ENTER\r
- std::string destr;\r
- const int strLen = str.size();\r
-\r
- static const char arr[] = {// insert from 'A' to 'Z'\r
- 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,\r
- 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,\r
- // insert from 'a' to 'z'\r
- 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,\r
- 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,\r
- 118, 119, 120, 121, 122,\r
- // insert from '0' to '9'\r
- 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,\r
- // insert '+' and '/'\r
- 43, 47};\r
- const int size = static_cast<int>(sizeof(arr) / sizeof(char));\r
- static std::map<char, int> base64EncodeMap;\r
-\r
- if (base64EncodeMap.size() == 0)\r
- for (int i = 0; i < size; i++)\r
- base64EncodeMap.insert(std::pair<char, int>(arr[i], i));\r
-\r
- LOG_INFO("Base64decode inconming str len %d ", strLen);\r
-\r
- if (strLen % 4 != 0) {\r
- // input string size must be multiple of 4\r
- LOG_INFO("Quit base64decode for strlen error");\r
- return destr;\r
- }\r
-\r
- if (strLen > 0) {\r
- int pos = 0;\r
- std::string subStr;\r
- int encodePrev[4] = {0, 0, 0, 0};\r
- int encodeEnd[3] = {0, 0, 0};\r
-\r
- while (pos < strLen) {\r
- subStr = str.substr(pos, 4);\r
- int i = 0;\r
-\r
- for (const auto &c : subStr) encodePrev[i++] = base64EncodeMap[c];\r
-\r
- encodeEnd[0] = (encodePrev[0] << 2) | (encodePrev[1] >> 4);\r
- encodeEnd[1] = (encodePrev[1] << 4) | (encodePrev[2] >> 2);\r
- encodeEnd[2] = (encodePrev[2] << 6) | encodePrev[3];\r
- destr.push_back(static_cast<char>(encodeEnd[0]));\r
- destr.push_back(static_cast<char>(encodeEnd[1]));\r
- destr.push_back(static_cast<char>(encodeEnd[2]));\r
- pos += 4;\r
- }\r
- }\r
-\r
- // base64 data contain "=" case\r
- int count = 0;\r
-\r
- for (int i = str.size() - 1; i >= 0; --i) {\r
- if (str[i] == '=')\r
- count++;\r
- else\r
- break;\r
- }\r
-\r
- LOG_INFO("[*] num of [=] ( %d )", count);\r
-\r
- if (count > 2) {\r
- LOG_INFO("[ERROR] num of = should less than two( %d )", count);\r
- destr.clear();\r
- } else if (count > 0) {\r
- destr.erase(destr.size() - count, count);\r
- }\r
-\r
- LOG_INFO("Base64Decode output str %d", destr.size());\r
- LOG_LEAVE\r
- return destr;\r
-}\r
- }\r
-\r
-} // namespace plusplayer\r
-\r
-// base64 rfs ut\r
-// int main()\r
-// {\r
-// std::cout <<"test"<<std::endl;\r
-// std::map<std::string,std::string> RFC_test;//RFC 4648 tc\r
-// RFC_test.insert(std::pair<std::string,std::string>("",""));\r
-// RFC_test.insert(std::pair<std::string,std::string>("f","Zg=="));\r
-// RFC_test.insert(std::pair<std::string,std::string>("fo","Zm8="));\r
-// RFC_test.insert(std::pair<std::string,std::string>("foo","Zm9v"));\r
-// RFC_test.insert(std::pair<std::string,std::string>("foob","Zm9vYg=="));\r
-// RFC_test.insert(std::pair<std::string,std::string>("fooba","Zm9vYmE="));\r
-// RFC_test.insert(std::pair<std::string,std::string>("foobar","Zm9vYmFy"));\r
-// std::map<std::string,std::string>::iterator iter;\r
-\r
-// for (iter = RFC_test.begin(); iter != RFC_test.end(); iter++)\r
-// {\r
-// std::string encodedstr =\r
-// Base64Encode(iter->first.c_str(),iter->first.length());\r
-// if(0!=encodedstr.compare(iter->second))\r
-// {\r
-// std::cout << "error encode test tc [" + iter->first +"] user result["+\r
-// encodedstr + "] refer["+iter->second+"]";\r
-// }\r
-// }\r
-// for (iter = RFC_test.begin(); iter != RFC_test.end(); iter++)\r
-// {\r
-// std::string decodedstr = Base64Decode(iter->second );\r
-// if(0!=decodedstr.compare(iter->first))\r
-// {\r
-// std::cout << "error decode test tc [" + iter->second +"] user result["+\r
-// decodedstr + "] refer["+iter->first+"]";\r
-// }\r
-// }\r
-\r
-// }\r
-#endif // __PLUSPLAYER_SRC_BASE64_H__\r
+++ /dev/null
-#define _TAG "plusplayer"\r
-#include "core/utils/caf_logger.h"\r
-#include "core/utils/plusplayer_log.h"\r
-#include "context-aware-api.h"\r
-#include "ContextData.h"\r
-#include "json/json.h"\r
-#define SUBJECT_RAW_STREAMING_EVENT "I/Raw/Streaming/Event"\r
-\r
-namespace plusplayer {\r
-\r
-CafLogger* CafLogger::instance_ = NULL;\r
-std::shared_ptr<ContextAware> CafLogger::context_aware_ = NULL;\r
-\r
-std::string EventStrName[] = {"None","Start", "End", "BitRate", "Buffering", "Resolution"};\r
-\r
-bool ContextAware::InitService() {\r
- return ContextAware_InitService();\r
-} \r
-\r
-void ContextAware::Write(std::string json_data) {\r
- return ContextAware_WriteRawStreamingEvent(json_data.c_str());\r
-}\r
-\r
-bool ContextAware::FiniService() {\r
- return ContextAware_FiniService();\r
-} \r
-\r
-CafLogger::CafLogger() {\r
- LOG_ENTER;\r
- connected_to_dbus_ = false;\r
- std::lock_guard<std::mutex> guard(object_lock_);\r
-\r
- if(context_aware_ == NULL) {\r
- context_aware_ = std::make_shared<ContextAware>();\r
- }\r
- \r
- if(context_aware_ != NULL)\r
- connected_to_dbus_ = context_aware_->InitService();\r
- msg_thread_stopped_ = true;\r
- app_id_ = "Unknown";\r
- unique_number = -1;\r
- if(connected_to_dbus_)\r
- LOG_INFO("CAF initialized successfully.");\r
- else\r
- LOG_ERROR("CAF initialization FAILED.");\r
- \r
- LOG_LEAVE;\r
-}\r
-\r
-CafLogger::~CafLogger() {\r
- LOG_ENTER;\r
- std::lock_guard<std::mutex> guard(object_lock_);\r
- StopMsgThread_();\r
- if(connected_to_dbus_ == true && context_aware_ != NULL)\r
- {\r
- connected_to_dbus_ = context_aware_->FiniService();\r
- }\r
- \r
- if(!connected_to_dbus_)\r
- LOG_INFO("CAF finished successfully.");\r
- LOG_LEAVE;\r
-}\r
-\r
-std::string CafLogger::GetEventStrName_(CafEventType event_type) {\r
- if(event_type > CafEventType::kNone && event_type < CafEventType::kEventMax)\r
- return EventStrName[(int)event_type];\r
- return "";\r
-}\r
-\r
-std::string CafLogger::GetEventValueStrName_(CafEventType event_type) {\r
- switch(event_type) {\r
- case CafEventType::kBitrate: return "BitRateValue";\r
- case CafEventType::kResolution: return "ResolutionValue";\r
- case CafEventType::kBuffering: return "BufferingValue";\r
- default:\r
- return "";\r
- }\r
-}\r
-\r
-std::string CafLogger::GetStateValueStrName_(CafEventType event_type) {\r
- switch(event_type) {\r
- case CafEventType::kStreamReady: return "StreamReady";\r
- case CafEventType::kIdle: return "Idle";\r
- case CafEventType::kReady: return "Ready";\r
- case CafEventType::kPlaying: return "Playing";\r
- case CafEventType::kPaused: return "Paused";\r
- default:\r
- return "";\r
- }\r
-}\r
-\r
-void CafLogger::SendData_(CafEventData event) {\r
- LOG_ENTER;\r
- ContextData cafData;\r
- cafData.SetValue("Appid",app_id_);\r
- switch(event.event_type) {\r
- case CafEventType::kStart: cafData.SetValue("Event", "Start");break;\r
- case CafEventType::kEnd: cafData.SetValue("Event", "End");break;\r
- case CafEventType::kBuffering: /* FALL THROUGH */\r
- //case CafEventType::kResolution: /* FALL THROUGH */\r
- case CafEventType::kBitrate: {\r
- std::string event_name = GetEventStrName_(event.event_type);\r
- cafData.SetValue("Event", event_name);\r
- std::string event_value_name = GetEventValueStrName_(event.event_type);\r
- cafData.SetValue(event_value_name.c_str(), event.event_data);\r
- }break;\r
- case CafEventType::kStreamReady: /* FALL THROUGH */\r
- case CafEventType::kIdle: /* FALL THROUGH */\r
- case CafEventType::kReady: /* FALL THROUGH */\r
- case CafEventType::kPlaying: /* FALL THROUGH */\r
- case CafEventType::kPaused: {\r
- cafData.SetValue("UniqueId", event.event_data);\r
- std::string state_value_name = GetStateValueStrName_(event.event_type);\r
- cafData.SetValue("PlayerState", state_value_name.c_str());\r
- }break;\r
- default:\r
- return;\r
- }\r
- LOG_ERROR("all eventdata message [%s]", cafData.MakeStr());\r
- if(context_aware_ != NULL) \r
- context_aware_->Write(cafData.MakeStr());\r
- LOG_LEAVE;\r
-}\r
-\r
-void CafLogger::MsgTask_() {\r
-LOG_ENTER;\r
-std::unique_lock<std::mutex> msg_mutex(msg_task_mutex_);\r
- do{\r
- if(msg_queue_.empty())\r
- msg_task_cv_.wait(msg_mutex);\r
- if(!msg_queue_.empty()) {\r
- CafEventData eventData = msg_queue_.front();\r
- SendData_(eventData);\r
- msg_queue_.pop();\r
- }\r
- } while(!msg_thread_stopped_);\r
- LOG_LEAVE;\r
-}\r
-\r
-void CafLogger::StartMsgThread_() {\r
- LOG_ENTER;\r
- std::lock_guard<std::mutex> guard(object_lock_);\r
- if(msg_thread_stopped_) {\r
- using_instance_.push(unique_number);\r
- msg_thread_stopped_ = false;\r
- msg_handler_task_ = std::async(std::launch::async, &CafLogger::MsgTask_, this);\r
- }\r
- LOG_LEAVE;\r
-}\r
-\r
-void CafLogger::StopMsgThread_() {\r
- LOG_ENTER;\r
- \r
- if(msg_thread_stopped_) return;\r
-\r
- using_instance_.pop();\r
-\r
- if(msg_handler_task_.valid() && using_instance_.empty()) {\r
- std::unique_lock<std::mutex> msg_mutex(msg_task_mutex_);\r
- msg_thread_stopped_ = true;\r
- msg_task_cv_.notify_one();\r
- msg_mutex.unlock();\r
- msg_handler_task_.wait();\r
- }\r
- LOG_LEAVE;\r
-}\r
-\r
-bool CafLogger::PushMessageToQueue_(CafEventType event_type, std::string data) {\r
- LOG_ENTER;\r
- bool ret = false;\r
- std::lock_guard<std::mutex> guard(object_lock_);\r
- if(msg_handler_task_.valid()) {\r
- CafEventData event;\r
- event.event_type = event_type;\r
- event.event_data = data;\r
- std::unique_lock<std::mutex> msg_mutex(msg_task_mutex_);\r
- msg_queue_.push(event);\r
- msg_mutex.unlock();\r
- msg_task_cv_.notify_one();\r
- ret = true;\r
- }\r
- LOG_LEAVE;\r
- return ret;\r
-}\r
-\r
-bool CafLogger::Connect_() {\r
- LOG_ENTER;\r
- std::lock_guard<std::mutex> guard(object_lock_);\r
- if(!connected_to_dbus_ && context_aware_ != NULL)\r
- connected_to_dbus_ = context_aware_->InitService();\r
- LOG_LEAVE;\r
- return connected_to_dbus_;\r
-}\r
-\r
-bool CafLogger::Disconnect_() {\r
- LOG_ENTER;\r
- std::lock_guard<std::mutex> guard(object_lock_);\r
- /*first stop message thread, then disconnect. */\r
- \r
- StopMsgThread_();\r
- LOG_INFO("Disconnecting to DBus.");\r
- if(connected_to_dbus_ && context_aware_ != NULL)\r
- connected_to_dbus_ = context_aware_->FiniService();\r
- if(!connected_to_dbus_)\r
- LOG_INFO("Disconnecting to DBus FAILED.");\r
- connected_to_dbus_ = false;\r
- LOG_LEAVE;\r
- return true;\r
-}\r
-\r
-bool CafLogger::isConnected_() {\r
- return connected_to_dbus_;\r
-}\r
-\r
-void CafLogger::setAppId_(std::string app_id) {\r
- app_id_ = app_id;\r
-}\r
-\r
-void CafLogger::setUniqueNumber_(int uniqueNumber) {\r
- unique_number = uniqueNumber;\r
-}\r
-\r
-int CafLogger::getUniqueNumber_() {\r
- return unique_number;\r
-}\r
-/******** STATIC FUNCTIONS ****************/\r
-\r
-bool CafLogger::Initialize() {\r
- LOG_ENTER;\r
-\r
- if(instance_ == NULL) {\r
- instance_ = new CafLogger();\r
- }\r
- LOG_LEAVE;\r
- return instance_->isConnected_();\r
-}\r
-\r
-bool CafLogger::LogMessage(CafEventType event_type, std::string data) {\r
- LOG_ENTER;\r
- bool ret = false;\r
-#ifndef SDK_DISABLED_FEATURE \r
- if(instance_ != NULL && instance_->isConnected_()) {\r
- ret = instance_->PushMessageToQueue_(event_type, data);\r
- }\r
-#endif\r
- LOG_LEAVE;\r
- return ret;\r
-}\r
-\r
-void CafLogger::StartLoggingThread() {\r
- LOG_ENTER;\r
- if(instance_ != NULL)\r
- instance_->StartMsgThread_();\r
- LOG_LEAVE;\r
-}\r
-\r
-void CafLogger::StopLoggingThread() {\r
- LOG_ENTER;\r
- if(instance_ != NULL)\r
- instance_->StopMsgThread_();\r
- LOG_LEAVE;\r
-}\r
-\r
-void CafLogger::SetAppId(std::string app_id) {\r
- LOG_ENTER;\r
- if(instance_ != NULL)\r
- instance_->setAppId_(app_id);\r
- LOG_LEAVE;\r
-}\r
-\r
-void CafLogger::SetUniqueNumber()\r
-{\r
- LOG_ENTER;\r
- int id = -1;\r
- if(instance_ != NULL)\r
- {\r
- id = instance_->getUniqueNumber_();\r
- instance_->setUniqueNumber_(++id);\r
- }\r
- LOG_LEAVE;\r
-}\r
-std::string CafLogger::GetUniqueNumber()\r
-{\r
- LOG_ENTER;\r
- int id = -1;\r
- std::string uniqueNumber;\r
- if(instance_ != NULL)\r
- { \r
- id = instance_->getUniqueNumber_();\r
- uniqueNumber = std::to_string(getpid()) + "_" + std::to_string(id);\r
- }\r
- LOG_LEAVE;\r
- return uniqueNumber;\r
-}\r
-\r
-void CafLogger::SetContextAware(std::shared_ptr<ContextAware>&& context_aware)\r
-{\r
- LOG_ENTER; \r
- context_aware_ = context_aware;\r
- LOG_LEAVE; \r
-} \r
-\r
-} //plusplayer
\ No newline at end of file
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-
-#include "plusplayer/decodedvideopacketex.h"
-
-namespace plusplayer {
-
- DecodedVideoPacketExPtr DecodedVideoPacketEx::Create(const uint64_t pts,
- const uint64_t duration, tbm_surface_h surface_data,
- const void* scaler_index) {
- return Ptr(new DecodedVideoPacketEx(pts, duration, surface_data, scaler_index));
- }
-
- DecodedVideoPacketEx::~DecodedVideoPacketEx() {
- if (surface_data_) {
- tbm_surface_destroy(surface_data_);
- surface_data_ = nullptr;
- }
- }
-} // namespace plusplayer
#include <thread>
#include "core/utils/plusplayer_log.h"
+#include "core/gstobject_guard.h"
namespace plusplayer {
return gst_element_factory_get_klass(factory);
}
+namespace internal {
+ void DisableGstPlugin(const std::string& plugin_name) {
+ LOG_INFO("disabling gst plugin [%s]", plugin_name.c_str());
+ GstRegistry *registry = gst_registry_get ();
+ if (!registry) {
+ LOG_ERROR("failed to get registry");
+ return;
+ }
+ GstElementFactory *factory = gst_element_factory_find (plugin_name.c_str());
+ if (!factory) {
+ LOG_DEBUG("gst plugin not found [%s]", plugin_name.c_str());
+ return;
+ }
+ gst_plugin_feature_set_rank (GST_PLUGIN_FEATURE (factory), GST_RANK_NONE);
+ gst_registry_add_feature (registry, GST_PLUGIN_FEATURE (factory));
+ }
+}
+
void GstInit() {
gst_init(NULL,NULL);
}
void GstInit(const Json::Value& root) {
- int argc = 1;
+ int argc = 0;
char* argv[6]{
nullptr,
};
+ argv[argc++] = const_cast<char*>("Plusplayer");
std::string gstparam1 = root.get("gstparam1", "").asString();
argv[argc++] = const_cast<char*>(gstparam1.c_str());
std::string gstparam2 = root.get("gstparam2", "").asString();
}
char** pargv = argv;
gst_init(&argc, &pargv);
+
+ /* disable gst plugins */
+ auto plugins = root.get("gst_plugins_disable", Json::arrayValue);
+ if (plugins.isArray()) {
+ for(auto plugin: plugins) {
+ std::string plugin_name = plugin.asString();
+ internal::DisableGstPlugin(plugin_name);
+ }
+ } else {
+ LOG_ERROR("'gst_plugins_disable' not an array [%s]", plugins.asString().c_str());
+ }
+}
+
+namespace internal {
+GList* GetFactories(GstCaps * caps, GstElementFactoryListType type) {
+ GList *factories = nullptr;
+ GList *filtered = nullptr;
+
+ auto caps_str = gstguard::make_guard(gst_caps_to_string(caps));
+ LOG_INFO("requesting factories for caps [%s]", caps_str.get());
+
+ /* return all compatible factories for caps */
+ factories =
+ gst_element_factory_list_get_elements (type, GST_RANK_MARGINAL);
+ if (factories) {
+ filtered = gst_element_factory_list_filter (factories, caps, GST_PAD_SINK,
+ gst_caps_is_fixed (caps));
+ gst_plugin_feature_list_free(factories);
+ }
+ if (!filtered)
+ LOG_ERROR("failed to get factories");
+
+ return filtered;
+}
+} //namespace internal
+
+GstElement* MakeElement(GstCaps * caps, GstElementFactoryListType type) {
+ GList *factories = nullptr;
+ GstElementFactory *factory = nullptr;
+ GstElement *element = nullptr;
+
+ auto caps_str = gstguard::make_guard(gst_caps_to_string(caps));
+ LOG_INFO("requesting factories for caps [%s]", caps_str.get());
+
+ factories = internal::GetFactories((GstCaps*)caps, type);
+ if (!factories) {
+ LOG_ERROR("failed to get factories");
+ return nullptr;
+ }
+
+ factory = GST_ELEMENT_FACTORY_CAST(factories->data);
+
+ LOG_INFO("Klass [%s] Factory [%s]",
+ gst_element_factory_get_klass(factory), GST_OBJECT_NAME(factory));
+ element = gst_element_factory_create (factory, NULL);
+ gst_plugin_feature_list_free (factories);
+
+ if (!element) {
+ LOG_ERROR("failed to make element");
+ return nullptr;
+ }
+
+ return element;
+}
+
+GstElement* MakeCapsFilter(GstPad * pad, GstElementFactoryListType type, const char* klass_keyword) {
+ GList *factories = nullptr;
+ GList *tmp = nullptr;
+ GstCaps *caps = nullptr;
+ GstCaps *filter_caps = nullptr;
+ GstElement *element = nullptr;
+ if (!pad) {
+ LOG_ERROR("invalid input : pad is null");
+ return nullptr;
+ }
+
+ caps = gst_pad_get_current_caps (pad);
+ if (!caps) {
+ LOG_ERROR ("there is no current caps, use query caps");
+ caps = gst_pad_query_caps (pad, nullptr);
+ }
+
+ auto caps_str = gstguard::make_guard(gst_caps_to_string(caps));
+ LOG_INFO("[%s:%s][%s]", GST_DEBUG_PAD_NAME(pad), caps_str.get());
+ LOG_DEBUG("factory keyword : %s", klass_keyword);
+
+ factories = internal::GetFactories((GstCaps*)caps, type);
+ if (!factories) {
+ LOG_ERROR("there is no factories");
+ gst_caps_unref (caps);
+ return nullptr;
+ }
+
+ LOG_DEBUG ("factory len %d", g_list_length(factories));
+ filter_caps = gst_caps_new_empty ();
+
+ for (tmp = factories; tmp; tmp = tmp->next) {
+ GstCaps *tcaps, *intersection;
+ const GList *tmps;
+ GstElementFactory *factory = GST_ELEMENT_FACTORY_CAST (tmp->data);
+
+ if (factory) {
+ const gchar *klass = gst_element_factory_get_metadata(factory, GST_ELEMENT_METADATA_KLASS);
+
+ if (!g_strrstr(klass, klass_keyword))
+ continue;
+
+ LOG_DEBUG ("Trying factory %s",
+ gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
+
+ for (tmps = gst_element_factory_get_static_pad_templates (factory); tmps;
+ tmps = tmps->next) {
+ GstStaticPadTemplate *st = (GstStaticPadTemplate *) tmps->data;
+ if (st->direction != GST_PAD_SINK || st->presence != GST_PAD_ALWAYS)
+ continue;
+ tcaps = gst_static_pad_template_get_caps (st);
+ intersection =
+ gst_caps_intersect_full (tcaps, caps, GST_CAPS_INTERSECT_FIRST);
+ filter_caps = gst_caps_merge (filter_caps, intersection);
+ gst_caps_unref (tcaps);
+ }
+ }
+ }
+
+ filter_caps = gst_caps_merge (filter_caps, gst_caps_ref (caps));
+
+ auto filter_caps_str = gstguard::make_guard(gst_caps_to_string(filter_caps));
+ LOG_INFO("create capsfilter with [%s]", filter_caps_str.get());
+
+ element = gst_element_factory_make ("capsfilter", NULL);
+ g_object_set (G_OBJECT (element), "caps", filter_caps, NULL);
+
+ gst_caps_unref (filter_caps);
+ gst_caps_unref (caps);
+ gst_plugin_feature_list_free (factories);
+
+ return element;
+}
+
+char** GetCookieList(const char* cookies) {
+ char **cookie_list = nullptr;
+ char *temp = nullptr;
+ guint i = 0;
+
+ if (!cookies || !strlen(cookies))
+ return nullptr;
+
+ SECURE_LOG_DEBUG("cookies : %zu[bytes] - %s", strlen(cookies), cookies);
+
+ temp = g_strdup(cookies);
+
+ /* trimming. it works inplace */
+ g_strstrip(temp);
+
+ /* split */
+ cookie_list = g_strsplit(temp, ";", 100);
+
+ if (!cookie_list) {
+ LOG_ERROR("failed to get cookie list");
+ goto EXIT;
+ }
+
+ for (i = 0; i < g_strv_length(cookie_list); i++) {
+ if (cookie_list[i]) {
+ if (strlen(cookie_list[i])) {
+ g_strstrip(cookie_list[i]);
+ SECURE_LOG_DEBUG("cookie_list[%d] : %zu[bytes] - %s", i,
+ strlen(cookie_list[i]), cookie_list[i]);
+ } else {
+ cookie_list[i][0] = '\0';
+ }
+ }
+ }
+
+EXIT:
+ if(temp)
+ g_free(temp);
+
+ return cookie_list;
}
} // namespace gst_util
void GstSignalHolder::DeleteAll() {
std::lock_guard<std::mutex> guard(item_lock_);
- LOG_INFO("num of signals[ %d ]", signal_list_.size());
+ LOG_INFO("num of signals[ %" G_GSIZE_FORMAT " ]", signal_list_.size());
signal_list_.clear();
}
+++ /dev/null
-//
-// @ Copyright [2017] <S/W Platform, Visual Display, Samsung Electronics>
-//
-
-#include "core/kpi.h"
-
-#include <sstream>
-
-#include "core/utils/plusplayer_log.h"
-
-/* for logger */
-#include "capi-system-info/system_info.h"
-#include "logger/Logger2.h"
-
-using namespace KPILogFramework;
-
-namespace {
-
-const char* GetProductYear(void) {
- static const char* year = nullptr;
- if (year) return year;
-
- int value = -1;
- int result = system_info_get_custom_int(
- "com.samsung/featureconf/product.tv_year", &value);
- if (result != SYSTEM_INFO_ERROR_NONE || value < 0) {
- LOG_ERROR(
- "can't get com.samsung/featureconf/product.tv_year, result:%d, "
- "value:%d",
- result, value);
- return "20";
- }
-
- static char str_year[3] = {0, };
- int size = snprintf(str_year, 3, "%d", value);
- if (size != 2) {
- LOG_ERROR("size is not 2!! size:%d, year:%d", size, value);
- return "20";
- }
-
- year = str_year;
- return year;
-}
-} // unnamed namespace
-
-namespace plusplayer {
-
-namespace internal {
-std::string GetSrcType(SourceType ptype) {
- switch (ptype) {
- case SourceType::kHttp:
- return "HTTP";
- case SourceType::kHls:
- return "HLS";
- case SourceType::kDash:
- return "DASH";
- case SourceType::kFile:
- return "FILE";
- case SourceType::kNone:
- case SourceType::kBase:
- case SourceType::kExternalSubtitle:
- case SourceType::kMax:
- default:
- return "others";
- }
-}
-
-std::string GetDrmType(drm::Type dtype) {
- switch (dtype) {
- case drm::Type::kNone:
- return "NONE";
- case drm::Type::kPlayready:
- return "PLAYREADY";
- case drm::Type::kMarlin:
- return "MARLIN";
- case drm::Type::kVerimatrix:
- return "VERIMATRIX";
- case drm::Type::kWidevineClassic:
- return "WIDEVINE CLASSIC";
- case drm::Type::kSecuremedia:
- return "SECUREMEDIA";
- case drm::Type::kSdrm:
- return "SDRM";
- case drm::Type::kWidevineCdm:
- return "WIDEVINE CDM";
- case drm::Type::kMax:
- default:
- return "others";
- }
-}
-
-std::string GetDecoderType(int ctype) { //(0:DEFAULT, 1:HW, 2:SW, 3:DISABLE)
- if (ctype == 0 || ctype == 1) {
- return "HW";
- } else if (ctype == 2) {
- return "SW";
- } else {
- return "DISABLE";
- }
-}
-} // namespace internal
-
-namespace kpi {
-bool CodecLogger::SendKpi(bool event_case, const CodecLoggerKeys& keys) {
- LOG_ENTER;
-
- std::string ptype = internal::GetSrcType(keys.src_type);
- std::string drm_type = internal::GetDrmType(keys.drm_type);
- std::string v_decoder_type = internal::GetDecoderType(keys.v_decoder_type);
- std::string a_decoder_type = internal::GetDecoderType(keys.a_decoder_type);
-
- // generate message
- std::stringstream str;
- str << "{";
- str << "ptype=" << ptype;
- str << ";dtype=" << drm_type;
- str << ";data_container=" << keys.container_type;
- str << ";v_decoder_type=" << v_decoder_type;
- str << ";v_codec=" << keys.v_codec;
- str << ";v_tag=0x" << std::hex << keys.v_tag;
- str << ";width=" << std::dec << keys.width;
- str << ";height=" << std::dec << keys.height;
- str << ";a_decoder_type=" << a_decoder_type;
- str << ";a_codec=" << keys.a_codec;
- str << ";a_tag=0x" << std::hex << keys.a_tag;
- str << ";app_id=" << keys.app_id;
- str << "}";
-
- return SendKpi_(event_case, str);
-}
-
-bool CodecLogger::SendKpi(bool event_case, const EsCodecLoggerKeys& keys) {
- LOG_ENTER;
-
- std::string ptype = keys.is_clean ? "MSE" : "EME";
- std::string drm_type = keys.is_clean ? "NONE" : "EME";
- std::string v_decoder_type("HW");
- std::string a_decoder_type("HW");
- std::string container_type("EsPlusplayer");
- unsigned int video_tag = 0;
- unsigned int audio_tag = 0;
- std::string video_codec = keys.v_codec + "-" +
- std::to_string(keys.v_codec_version);
-
- // generate message
- std::stringstream str;
- str << "{";
- str << "ptype=" << ptype;
- str << ";dtype=" << drm_type;
- str << ";data_container=" << container_type;
- str << ";v_decoder_type=" << v_decoder_type;
- str << ";v_codec=" << keys.v_codec;
- str << ";v_tag=0x" << std::hex << video_tag;
- str << ";width=" << std::dec << keys.width;
- str << ";height=" << std::dec << keys.height;
- str << ";a_decoder_type=" << a_decoder_type;
- str << ";a_codec=" << keys.a_codec;
- str << ";a_tag=0x" << std::hex << audio_tag;
- str << ";app_id=" << keys.app_id;
- str << "}";
-
- return SendKpi_(event_case, str);
-}
-
-bool CodecLogger::SendKpi_(bool event_case, const std::stringstream& message) {
- LOG_ENTER;
- const char* year = ::GetProductYear();
-
- // send message to KPI logger
- std::stringstream service_name;
- service_name << year << "_codec";
- std::string eventName;
- std::string category;
- if (event_case) {
- eventName = "PLAYBACK";
- category = "EV001";
- } else {
- eventName = "ERRPLAY";
- category = "EV002";
- }
-
- LOG_ERROR("[KPI] service_name: %s, desc_log: %s",
- service_name.str().c_str(), message.str().c_str());
-
- CLogger* pLogger = CLogger::GetInstance();
- LoggerErrorCode result = LOGGER_ERROR_NONE;
- result = pLogger->AddEventLogSync(service_name.str().c_str(), eventName.c_str(),
- category.c_str(), message.str().c_str());
- if (result != LOGGER_ERROR_NONE) {
- LOG_ERROR("Failed to send KPI log for esplayer, result:%d", result);
- return false;
- }
-
- return true;
-}
-
-
-} // namespace kpi
-} // namespace plusplayer
#include <cassert>
-#ifndef PLUPLAYER_DOWNLOADABLE_APP_TVPLUS
#include "tzplatform_config.h"
-#endif
namespace plusplayer {
namespace plusplayer_cfg {
-
+
const char* GetIniPath() {
const char* path =
tzplatform_mkpath(TZ_SYS_RO_ETC, "multimedia/esplusplayer.ini");
#include "core/track_util.h"
#include <string>
-
+#include <inttypes.h>
#include "core/utils/plusplayer_log.h"
namespace plusplayer {
track.sample_rate, track.sample_format, track.channels, track.version, track.layer);
LOG_INFO(
"bits_per_sample %d block_align : %d bitrate : %d endianness : %d is_signed : %d",
- track.bits_per_sample, track.block_align, track.bitrate, track.endianness, track.is_signed);
+ track.bits_per_sample, track.block_align, track.bitrate, track.endianness, track.is_signed);
LOG_INFO("active %d subtitle_format : %s ", track.active, track.subtitle_format.c_str() );
LOG_INFO("use_swdecoder : %d", track.use_swdecoder);
LOG_INFO("language_code: %s", track.language_code.c_str());
+ LOG_INFO("stream format: %s", track.stream_format.c_str());
+ LOG_INFO("alignment: %s", track.alignment.c_str());
+ LOG_INFO("original-media-type: %s", track.original_media_type.c_str());
+ LOG_INFO("protection-system: %s", track.protection_system.c_str());
}
uint64_t GetPositionWithinBoundary(const uint64_t duration,
const uint64_t position,
const uint64_t threshold) {
- LOG_DEBUG("duration[%llu] position[%llu] threshold[%llu]", duration, position,
- threshold);
+ LOG_DEBUG("duration[%" PRIu64 "] position[%" PRIu64 "] threshold[%" PRIu64 "]", duration, position, threshold);
if (duration < threshold) return position;
uint64_t safe_pos = position;
uint64_t boundary = duration - threshold;
GstMapInfo codec_data_info;
if (gst_buffer_map(buffer, &codec_data_info, GST_MAP_READ)) {
LOG_DEBUG("codec extra data [ %s ]", codec_data_info.data);
- LOG_DEBUG("codec extra data size[ %d ]", codec_data_info.size);
+ LOG_DEBUG("codec extra data size[ %" G_GSIZE_FORMAT " ]", codec_data_info.size);
if (IsValidCodecDataSize(codec_data_info.size)) {
std::shared_ptr<char> data(new char[codec_data_info.size],
std::default_delete<char[]>());
track->codec_data = data;
track->codec_data_len = codec_data_info.size;
} else {
- LOG_WARN("Warning invalid codec extra data size [%d]",
+ LOG_WARN("Warning invalid codec extra data size [%" G_GSIZE_FORMAT "]",
codec_data_info.size);
}
gst_buffer_unmap(buffer, &codec_data_info);
trackrenderer_set_ini_property(handle_, trackrenderer_iniproperty, size);
}
+void TrackRendererAdapter::SetIniElement(
+ const std::map<std::string, std::string>& elements) {
+ const int size = elements.size();
+ if (size <= 0) return;
+ TrackRendererIniElement trackrenderer_inielement[size];
+ int index = 0;
+ for (const auto& pair : elements) {
+ trackrenderer_inielement[index].key = pair.first.c_str();
+ trackrenderer_inielement[index].value = pair.second.c_str();
+ index++;
+ }
+ trackrenderer_set_ini_element(handle_, trackrenderer_inielement, size);
+}
+
bool TrackRendererAdapter::Seek(uint64_t time_millisecond,
double playback_rate) {
if (trackrenderer_seek(handle_, time_millisecond, playback_rate) == kFailed) {
return true;
}
-bool TrackRendererAdapter::GetDroppedFramesForCatchup(TrackType type,
- void* counts) {
- if (trackrenderer_get_dropped_frames_for_catchup(
- handle_, adapter_utils::ConvertToTrackRendererTrackType(type),
- counts) == kFailed) {
- return false;
- }
- return true;
-}
-
bool TrackRendererAdapter::Deactivate(TrackType type) {
if (trackrenderer_deactivate(
handle_, adapter_utils::ConvertToTrackRendererTrackType(type)) ==
TrackRendererDecoderInputBuffer decoderinputbuffer{
adapter_utils::ConvertToTrackRendererTrackType(data->GetType()),
data->GetIndex(),
- static_cast<void*>(const_cast<GstBuffer*>(data->Get()))};
+ static_cast<void*>(const_cast<GstBuffer*>(data->Get())),
+ static_cast<void*>(const_cast<GstCaps*>(data->GetCaps()))};
#else
TrackRendererDecoderInputBuffer decoderinputbuffer{
adapter_utils::ConvertToTrackRendererTrackType(data->GetType()),
- data->GetIndex(), const_cast<GstBuffer*>(data->Get())};
+ data->GetIndex(), const_cast<GstBuffer*>(data->Get()),
+ const_cast<GstCaps*>(data->GetCaps())};
#endif
if (trackrenderer_submit_packet(handle_, &decoderinputbuffer, nullptr) ==
kFailed) {
TrackRendererDecoderInputBuffer decoderinputbuffer{
adapter_utils::ConvertToTrackRendererTrackType(data->GetType()),
data->GetIndex(),
- static_cast<void*>(const_cast<GstBuffer*>(data->Get()))};
+ static_cast<void*>(const_cast<GstBuffer*>(data->Get())),
+ static_cast<void*>(const_cast<GstCaps*>(data->GetCaps()))};
#else
TrackRendererDecoderInputBuffer decoderinputbuffer{
adapter_utils::ConvertToTrackRendererTrackType(data->GetType()),
- data->GetIndex(), const_cast<GstBuffer*>(data->Get())};
+ data->GetIndex(), const_cast<GstBuffer*>(data->Get()),
+ const_cast<GstCaps*>(data->GetCaps())};
#endif
TrackRendererSubmitStatus submitstatus;
if (trackrenderer_submit_packet(handle_, &decoderinputbuffer,
TrackRendererDecoderInputBuffer decoderinputbuffer{
adapter_utils::ConvertToTrackRendererTrackType(data->GetType()),
data->GetIndex(),
- static_cast<void*>(const_cast<GstBuffer*>(data->Get()))};
+ static_cast<void*>(const_cast<GstBuffer*>(data->Get())),
+ static_cast<void*>(const_cast<GstCaps*>(data->GetCaps()))};
#else
TrackRendererDecoderInputBuffer decoderinputbuffer{
adapter_utils::ConvertToTrackRendererTrackType(data->GetType()),
- data->GetIndex(), const_cast<GstBuffer*>(data->Get())};
+ data->GetIndex(), const_cast<GstBuffer*>(data->Get()),
+ const_cast<GstCaps*>(data->GetCaps())};
#endif
TrackRendererSubmitStatus submitstatus;
if (trackrenderer_submit_packet2(handle_, &decoderinputbuffer,
handle_, adapter_utils::ConvertToTrackRendererTrackType(type));
}
+void TrackRendererAdapter::SetDrmLicenseKey(TrackType type, const std::string& key) {
+ trackrenderer_set_drm_license_key(
+ handle_, adapter_utils::ConvertToTrackRendererTrackType(type),
+ key.c_str());
+}
bool TrackRendererAdapter::SetDisplayMode(const DisplayMode& mode) {
if (trackrenderer_set_display_mode(
handle_, adapter_utils::ConvertToTrackRendererDisplayMode(mode)) ==
return true;
}
-bool TrackRendererAdapter::SetDisplaySubsurface(const DisplayType& type,
- void* ecore_wl2_subsurface,
- int x, int y, int w, int h) {
- if (trackrenderer_set_display_ecore_wl2_subsurface(
- handle_, adapter_utils::ConvertToTrackRendererDisplayType(type),
- ecore_wl2_subsurface, x, y, w, h) == kFailed) {
- return false;
- }
- return true;
-}
-
void TrackRendererAdapter::GetDisplay(DisplayType* type, Geometry* area) {
TrackRendererGeometry geometry = {0, 0, 1920, 1080};
TrackRendererDisplayType display_type = kTrackRendererDisplayTypeNone;
return true;
}
-bool TrackRendererAdapter::ResizeRenderRect(const RenderRect& rect) {
- TrackRendererRenderRect result = {0, 0, 1920, 1080};
- adapter_utils::MakeTrackRendererRenderRect(&result, rect);
- if (trackrenderer_resize_render_rect(handle_, &result) == kFailed) {
- return false;
- }
- return true;
-}
-
bool TrackRendererAdapter::SetDisplayRotate(const DisplayRotation& rotate) {
if (trackrenderer_set_display_rotate(
handle_, adapter_utils::ConvertToTrackRendererDisplayRotate(
{ValueType::kUInt32, "video-min-byte-percent"}},
{TrackRendererAdapter::Attribute::kAudioMinByteThreshold,
{ValueType::kUInt32, "audio-min-byte-percent"}},
+ {TrackRendererAdapter::Attribute::kVideoQueueMaxBuffer,
+ {ValueType::kUInt64, "video-queue-max-buffer"}},
+ {TrackRendererAdapter::Attribute::kAudioQueueMaxBuffer,
+ {ValueType::kUInt64, "audio-queue-max-buffer"}},
+#if 0
{TrackRendererAdapter::Attribute::kVideoQueueMaxTime,
{ValueType::kUInt64, "video-queue-max-time"}},
{TrackRendererAdapter::Attribute::kAudioQueueMaxTime,
{TrackRendererAdapter::Attribute::kVideoRenderTimeOffset,
{ValueType::kInt64, "video-render-time-offset"}},
{TrackRendererAdapter::Attribute::kAudioRenderTimeOffset,
- {ValueType::kInt64, "audio-render-time-offset"}}};
+ {ValueType::kInt64, "audio-render-time-offset"}}
+#endif
+ };
static const std::map<TrackRendererAdapter::Attribute, AttrInfo>
kConfigInfoTable = {
{ValueType::kUInt64, "start-rendering-time"}},
{TrackRendererAdapter::Attribute::kFmmMode,
{ValueType::kUInt32, "fmm-mode"}},
+#if 0
{TrackRendererAdapter::Attribute::kAlternativeVideoResource,
{ValueType::kUInt32, "alternative-video-resource"}},
{TrackRendererAdapter::Attribute::kVideoDecodingMode,
{ValueType::kUInt32, "video-decoding-mode"}},
{TrackRendererAdapter::Attribute::kLateVideoFrameDropMode,
- {ValueType::kUInt32, "late-video-frame-drop-mode"}}};
+ {ValueType::kUInt32, "late-video-frame-drop-mode"}}
+#endif
+ };
} // namespace adapter_utils
void TrackRendererAdapter::SetAttribute(
void TrackRendererAdapter::RegisterListener(EventListener* listener) {
eventlistener_ = listener;
trackrenderer_set_error_cb(handle_, ErrorCb_, (void*)this);
- trackrenderer_set_error_msg_cb(handle_, ErrorMsgCb_, (void*)this);
trackrenderer_set_resourceconflict_cb(handle_, ResourceConflictCb_,
(void*)this);
trackrenderer_set_seekdone_cb(handle_, SeekDoneCb_, (void*)this);
trackrenderer_set_closedcaption_cb(handle_, ClosedCaptionDataCb_,
(void*)this);
trackrenderer_set_drminitdata_cb(handle_, DrmInitDataCb_, (void*)this);
- trackrenderer_set_media_packet_video_decoded_cb(
- handle_, MediaPacketVideoDecodedCb_, (void*)this);
- trackrenderer_set_media_packet_video_raw_decoded_cb(
- handle_, MediaPacketVideoRawDecodedCb_, (void*)this);
- trackrenderer_set_multiview_start_video_cb(handle_, MultiviewStartVideoCb_,
- (void*)this);
- trackrenderer_set_multiview_stop_video_cb(handle_, MultiviewStopVideoCb_,
- (void*)this);
}
void TrackRendererAdapter::RegisterListenerForEsplayer(
EventListener* listener) {
eventlistener_ = listener;
trackrenderer_set_error_cb(handle_, ErrorCb_, (void*)this);
- trackrenderer_set_error_msg_cb(handle_, ErrorMsgCb_, (void*)this);
trackrenderer_set_resourceconflict_cb(handle_, ResourceConflictCb_,
(void*)this);
trackrenderer_set_seekdone_cb(handle_, SeekDoneCb_, (void*)this);
trackrenderer_set_seekdata_cb(handle_, SeekDataCb_, (void*)this);
trackrenderer_set_closedcaption_cb(handle_, ClosedCaptionDataCb_,
(void*)this);
- trackrenderer_set_media_packet_video_tbmptr_cb(
- handle_, MediaPacketGetTbmBufPtrCb_, (void*)this);
trackrenderer_set_media_packet_video_decoded_cb(
handle_, MediaPacketVideoDecodedCb_, (void*)this);
- trackrenderer_set_media_packet_video_raw_decoded_cb(
- handle_, MediaPacketVideoRawDecodedCb_, (void*)this);
- trackrenderer_set_first_decoding_done_cb(handle_, FirstDecodingDoneCb_,
- (void*)this);
- trackrenderer_set_video_decoder_underrun_cb(handle_, VideoDecoderUnderrunCb_,
- (void*)this);
- trackrenderer_set_video_latency_status_cb(handle_, VideoLatencyStatusCb_,
- (void*)this);
- trackrenderer_set_audio_latency_status_cb(handle_, AudioLatencyStatusCb_,
- (void*)this);
}
TrackRendererState TrackRendererAdapter::GetState() {
}
void TrackRendererAdapter::SetVideoFrameBufferType(
- VideoFrameTypeStrategyPtr strategy) {
- strategy->SetType(handle_);
-}
-
-bool TrackRendererAdapter::SetVideoFrameBufferScaleResolution(
- const uint32_t& target_width, const uint32_t& target_height) {
- if (trackrenderer_set_video_frame_buffer_scale_resolution(
- handle_, target_width, target_height) == kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetDecodedVideoFrameRate(
- const Rational& request_framerate) {
- TrackRendererRational request_fps;
- adapter_utils::MakeTrackRendererRational(&request_fps, request_framerate);
- if (trackrenderer_set_decoded_video_frame_rate(handle_, request_fps) ==
- kFailed) {
- return false;
- }
- return true;
+ const DecodedVideoFrameBufferType& type) {
+ trackrenderer_set_video_frame_buffer_type(
+ handle_, adapter_utils::ConvertToVideoFrameBufferType(type));
}
bool TrackRendererAdapter::RenderVideoFrame() {
return true;
}
-bool TrackRendererAdapter::SetAiFilter(void* aifilter) {
- if (trackrenderer_set_aifilter(handle_, aifilter) == kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetCatchUpSpeed(const CatchUpSpeed& level) {
- if (trackrenderer_set_catch_up_speed(
- handle_, adapter_utils::ConvertToTrackRendererCatchUpSpeed(level)) ==
- kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::GetVideoLatencyStatus(LatencyStatus* status) {
- TrackRendererLatencyStatus current_status = kTrackRendererLatencyStatusLow;
- if (trackrenderer_get_video_latency_status(handle_, ¤t_status) ==
- kFailed) {
- return false;
- }
- *status = adapter_utils::ConvertToLatencyStatus(current_status);
- return true;
-}
-
-bool TrackRendererAdapter::GetAudioLatencyStatus(LatencyStatus* status) {
- TrackRendererLatencyStatus current_status = kTrackRendererLatencyStatusLow;
- if (trackrenderer_get_audio_latency_status(handle_, ¤t_status) ==
- kFailed) {
- return false;
- }
- *status = adapter_utils::ConvertToLatencyStatus(current_status);
- return true;
-}
-
-bool TrackRendererAdapter::SetVideoMidLatencyThreshold(
- const unsigned int threshold) {
- if (trackrenderer_set_video_mid_latency_threshold(handle_, threshold) ==
- kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetAudioMidLatencyThreshold(
- const unsigned int threshold) {
- if (trackrenderer_set_audio_mid_latency_threshold(handle_, threshold) ==
- kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetVideoHighLatencyThreshold(
- const unsigned int threshold) {
- trackrenderer_set_video_high_latency_cb(handle_, VideoHighLatencyCb_,
- (void*)this);
-
- if (trackrenderer_set_video_high_latency_threshold(handle_, threshold) ==
- kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetAudioHighLatencyThreshold(
- const unsigned int threshold) {
- trackrenderer_set_audio_high_latency_cb(handle_, AudioHighLatencyCb_,
- (void*)this);
-
- if (trackrenderer_set_audio_high_latency_threshold(handle_, threshold) ==
- kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::InitAudioEasingInfo(
- const uint32_t init_volume, const uint32_t init_elapsed_time,
- const AudioEasingInfo& easing_info) {
- TrackRendererAudioEasingInfo info;
- adapter_utils::MakeTrackRendererAudioEasingInfo(&info, easing_info);
- if (trackrenderer_init_audio_easing_info(
- handle_, init_volume, init_elapsed_time, &info) == kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::UpdateAudioEasingInfo(
- const AudioEasingInfo& easing_info) {
- TrackRendererAudioEasingInfo info;
- adapter_utils::MakeTrackRendererAudioEasingInfo(&info, easing_info);
- if (trackrenderer_update_audio_easing_info(handle_, &info) == kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::GetAudioEasingInfo(uint32_t* current_volume,
- uint32_t* elapsed_time,
- AudioEasingInfo* easing_info) {
- TrackRendererAudioEasingInfo info;
- if (trackrenderer_get_audio_easing_info(handle_, current_volume, elapsed_time,
- &info) == kFailed) {
- return false;
- }
- adapter_utils::MakeAudioEasingInfo(easing_info, info);
- return true;
-}
-
-bool TrackRendererAdapter::StartAudioEasing() {
- if (trackrenderer_start_audio_easing(handle_) == kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::StopAudioEasing() {
- if (trackrenderer_stop_audio_easing(handle_) == kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::GetVirtualRscId(const RscType type,
- int* virtual_id) {
- TrackRendererRscType converted_type = kTrackRendererRscTypeVideoRenderer;
- if (!adapter_utils::ConvertToTrackRendererRscType(type, &converted_type))
- return false;
- if (trackrenderer_get_virtual_rsc_id(handle_, converted_type, virtual_id) ==
- kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetAdvancedPictureQualityType(
- const AdvPictureQualityType type) {
- TrackRendererAdvPictureQualityType converted_type =
- kTrackRendererAdvPictureQualityTypeVideoCall;
- if (!adapter_utils::ConvertToTrackRendererAdvPictureQualityType(
- type, &converted_type))
- return false;
- if (trackrenderer_set_advanced_picture_quality_type(
- handle_, converted_type) == kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetResourceAllocatePolicy(
- const RscAllocPolicy policy) {
- TrackRendererRscAllocPolicy converted_policy =
- kTrackRendererRscAllocExclusive;
- if (!adapter_utils::ConvertToTrackRendererRscAllocPolicy(policy,
- &converted_policy))
- return false;
- if (trackrenderer_set_resource_allocate_policy(handle_, converted_policy) ==
- kFailed) {
- return false;
- }
- return true;
-}
-
-bool TrackRendererAdapter::SetVideoParDar(uint64_t time_millisecond,
- uint32_t par_num, uint32_t par_den,
- uint32_t dar_num, uint32_t dar_den) {
- if (trackrenderer_set_video_par_dar(handle_, time_millisecond, par_num,
- par_den, dar_num, dar_den) == kFailed) {
- return false;
- }
- return true;
-}
-
/////////////////////////////////////////////
/////////////// Callbacks ///////////////////
/////////////////////////////////////////////
adapter_utils::ConvertToErrorType(error_code));
}
-void TrackRendererAdapter::ErrorMsgCb_(const TrackRendererErrorType error_code,
- char* error_msg, UserData userdata) {
- auto adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnErrorMsg(
- adapter_utils::ConvertToErrorType(error_code), error_msg);
-}
-
void TrackRendererAdapter::ResourceConflictCb_(UserData userdata) {
auto adapter = static_cast<TrackRendererAdapter*>(userdata);
if (!adapter) return;
offset);
}
-void TrackRendererAdapter::MediaPacketGetTbmBufPtrCb_(void** ptr,
- bool is_scale_change,
- UserData userdata) {
- auto adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnMediaPacketGetTbmBufPtr(ptr, is_scale_change);
-}
-
void TrackRendererAdapter::MediaPacketVideoDecodedCb_(
const TrackRendererDecodedVideoPacket* packet, UserData userdata) {
auto adapter = static_cast<TrackRendererAdapter*>(userdata);
adapter->eventlistener_->OnMediaPacketVideoDecoded(_packet);
}
-void TrackRendererAdapter::MediaPacketVideoRawDecodedCb_(
- const TrackRendererDecodedVideoRawModePacket* packet,
- TrackRendererDecodedVideoType type, UserData userdata) {
- auto adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- DecodedVideoRawModePacket _packet;
- _packet.type = static_cast<DecodedVideoRawModePacketType>(type);
- _packet.pts = packet->pts;
- _packet.width = packet->width;
- _packet.height = packet->height;
- _packet.data =
- *static_cast<DecodedVideoRawModePacket::Data*>(packet->internal_data);
- adapter->eventlistener_->OnMediaPacketVideoRawDecoded(_packet);
-}
-
-void TrackRendererAdapter::VideoDecoderUnderrunCb_(UserData userdata) {
- auto* adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnVideoDecoderUnderrun();
-}
-
-void TrackRendererAdapter::VideoLatencyStatusCb_(
- const TrackRendererLatencyStatus video_latency_status, UserData userdata) {
- auto* adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnVideoLatencyStatus(
- adapter_utils::ConvertToLatencyStatus(video_latency_status));
-}
-
-void TrackRendererAdapter::AudioLatencyStatusCb_(
- const TrackRendererLatencyStatus audio_latency_status, UserData userdata) {
- auto* adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnAudioLatencyStatus(
- adapter_utils::ConvertToLatencyStatus(audio_latency_status));
-}
-
-void TrackRendererAdapter::VideoHighLatencyCb_(UserData userdata) {
- auto* adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnVideoHighLatency();
-}
-
-void TrackRendererAdapter::AudioHighLatencyCb_(UserData userdata) {
- auto* adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnAudioHighLatency();
-}
-
-void TrackRendererAdapter::MultiviewStartVideoCb_(UserData userdata) {
- auto adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnMultiviewStartVideo();
-}
-
-void TrackRendererAdapter::MultiviewStopVideoCb_(UserData userdata) {
- auto adapter = static_cast<TrackRendererAdapter*>(userdata);
- if (!adapter) return;
- adapter->eventlistener_->OnMultiviewStopVideo();
-}
} // namespace plusplayer
track->use_swdecoder = 0; // int use_swdecoder
track->language_code = nullptr; // const char* language_code
track->subtitle_format = nullptr; // const char* subtitle_format
+ track->stream_format = nullptr;
+ track->alignment = nullptr;
+ track->original_media_type = nullptr;
+ track->protection_system = nullptr;
}
void MakeGeometry(Geometry* roi, const TrackRendererGeometry& geometry) {
crop->scale_h = area.scale_h;
}
+#if 0
void MakeTrackRendererRenderRect(TrackRendererRenderRect* output,
const RenderRect& input) {
output->x = input.x;
output->w = input.w;
output->h = input.h;
}
+#endif
void MakeTrackRendererTrack(TrackRendererTrack* track, const Track& trackinfo) {
InitTrack(track);
track->use_swdecoder = trackinfo.use_swdecoder;
track->language_code = trackinfo.language_code.c_str();
track->subtitle_format = trackinfo.subtitle_format.c_str();
+ track->stream_format = trackinfo.stream_format.c_str();
+ track->alignment = trackinfo.alignment.c_str();
+ track->original_media_type = trackinfo.original_media_type.c_str();
+ track->protection_system = trackinfo.protection_system.c_str();
}
void MakeTrackRendererAppInfo(TrackRendererAppInfo* app_attr,
app_attr->type = const_cast<char*>(app_info.type.c_str());
}
-void MakeAudioEasingInfo(AudioEasingInfo* easing_info,
- const TrackRendererAudioEasingInfo& easing_attr) {
- easing_info->target_volume = easing_attr.target_volume;
- easing_info->duration = easing_attr.duration;
- easing_info->type = ConvertToAudioEasingType(easing_attr.type);
-}
-
-void MakeTrackRendererAudioEasingInfo(TrackRendererAudioEasingInfo* easing_attr,
- const AudioEasingInfo& easing_info) {
- easing_attr->target_volume = easing_info.target_volume;
- easing_attr->duration = easing_info.duration;
- easing_attr->type = ConvertToTrackRendererAudioEasingType(easing_info.type);
-}
-
-void MakeTrackRendererRational(TrackRendererRational* rational_attr,
- const Rational& rational_info) {
- if (!rational_attr) return;
- rational_attr->num = rational_info.num;
- rational_attr->den = rational_info.den;
-}
-
DisplayMode ConvertToDisplayMode(TrackRendererDisplayMode typevalue) {
switch (typevalue) {
case kTrackRendererDisplayModeLetterBox: {
case drm::Type::kWidevineCdm: {
return kTrackRendererDrmTypeWidevineCdm;
}
+ case drm::Type::kClearkey: {
+ return kTrackRendererDrmTypeClearkey;
+ }
case drm::Type::kMax: {
return kTrackRendererDrmTypeDrmMax;
}
return BufferStatus::kUnderrun;
}
-TrackRendererCatchUpSpeed ConvertToTrackRendererCatchUpSpeed(
- const CatchUpSpeed& level) {
- switch (level) {
- case CatchUpSpeed::kNone: {
- return kTrackRendererCatchUpSpeedNone;
- }
- case CatchUpSpeed::kSlow: {
- return kTrackRendererCatchUpSpeedSlow;
- }
- case CatchUpSpeed::kNormal: {
- return kTrackRendererCatchUpSpeedNormal;
- }
- case CatchUpSpeed::kFast: {
- return kTrackRendererCatchUpSpeedFast;
- }
- }
- LOG_ERROR("Unknown catch up speed");
- return kTrackRendererCatchUpSpeedNone;
-}
-
-LatencyStatus ConvertToLatencyStatus(const TrackRendererLatencyStatus& status) {
- switch (status) {
- case kTrackRendererLatencyStatusLow: {
- return LatencyStatus::kLow;
- }
- case kTrackRendererLatencyStatusMid: {
- return LatencyStatus::kMid;
- }
- case kTrackRendererLatencyStatusHigh: {
- return LatencyStatus::kHigh;
- }
- }
- LOG_ERROR("Unknown status");
- return LatencyStatus::kLow;
-}
-
-AudioEasingType ConvertToAudioEasingType(
- const TrackRendererAudioEasingType& type) {
- switch (type) {
- case TrackRendererAudioEasingType::kTrackRendererAudioEasingLinear: {
- return AudioEasingType::kAudioEasingLinear;
- }
- case TrackRendererAudioEasingType::kTrackRendererAudioEasingIncubic: {
- return AudioEasingType::kAudioEasingIncubic;
- }
- case TrackRendererAudioEasingType::kTrackRendererAudioEasingOutcubic: {
- return AudioEasingType::kAudioEasingOutcubic;
- }
- default:
- LOG_ERROR("Unknown audio easing type");
- return AudioEasingType::kAudioEasingNone;
- }
-}
-
-TrackRendererAudioEasingType ConvertToTrackRendererAudioEasingType(
- const AudioEasingType& type) {
- switch (type) {
- case AudioEasingType::kAudioEasingLinear: {
- return TrackRendererAudioEasingType::kTrackRendererAudioEasingLinear;
- }
- case AudioEasingType::kAudioEasingIncubic: {
- return TrackRendererAudioEasingType::kTrackRendererAudioEasingIncubic;
- }
- case AudioEasingType::kAudioEasingOutcubic: {
- return TrackRendererAudioEasingType::kTrackRendererAudioEasingOutcubic;
- }
- default:
- LOG_ERROR("Unknown audio easing type");
- return TrackRendererAudioEasingType::kTrackRendererAudioEasingNone;
- }
-}
-
-bool ConvertToTrackRendererRscType(const RscType& typevalue,
- TrackRendererRscType* type) {
- switch (typevalue) {
- case RscType::kVideoRenderer: {
- *type = kTrackRendererRscTypeVideoRenderer;
- return true;
- }
- default:
- LOG_ERROR("unknown resource type");
- return false;
- }
-}
-
-bool ConvertToTrackRendererAdvPictureQualityType(
- const AdvPictureQualityType& typevalue,
- TrackRendererAdvPictureQualityType* type) {
- switch (typevalue) {
- case AdvPictureQualityType::kVideoCall: {
- *type = kTrackRendererAdvPictureQualityTypeVideoCall;
- return true;
- }
- case AdvPictureQualityType::kUsbCamera: {
- *type = kTrackRendererAdvPictureQualityTypeUsbCamera;
- return true;
- }
- default:
- LOG_ERROR("unknown resource type");
- return false;
- }
-}
-
-bool ConvertToTrackRendererRscAllocPolicy(const RscAllocPolicy& policyvalue,
- TrackRendererRscAllocPolicy* policy) {
- switch (policyvalue) {
- case RscAllocPolicy::kRscAllocExclusive: {
- *policy = kTrackRendererRscAllocExclusive;
- return true;
- }
- case RscAllocPolicy::kRscAllocConditional: {
- *policy = kTrackRendererRscAllocConditional;
- return true;
- }
- default:
- LOG_ERROR("unknown policy");
- return false;
- }
-}
-
} // namespace adapter_utils
} // namespace plusplayer
+++ /dev/null
-#include "core/videoframetypestrategy.h"
-
-#include <trackrenderer_capi/trackrenderer_capi.h>
-#include <trackrenderer_capi/trackrenderer_internal.h>
-
-#include "core/trackrendereradapter_utils.h"
-
-namespace plusplayer {
-DefaultVideoFrameTypeStrategy::DefaultVideoFrameTypeStrategy(
- const DecodedVideoFrameBufferType type)
- : type_(type) {}
-
-void DefaultVideoFrameTypeStrategy::SetType(TrackRendererHandle handle) {
- trackrenderer_set_video_frame_buffer_type(
- handle, adapter_utils::ConvertToVideoFrameBufferType(type_));
-}
-
-void RawVideoFrameTypeStrategy::SetType(TrackRendererHandle handle) {
- trackrenderer_set_video_frame_buffer_type_ext(
- handle, kTrackRendererDecodedVideoFrameBufferExtRaw);
-}
-} // namespace plusplayer
\ No newline at end of file
+++ /dev/null
-unit_test/ut_esplusplayer_all.xml
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<TestFarm>
- <Target AssignTargets="1">
- <TestPackage Name="esplusplayer" RpmName="esplusplayer-ut-component-tomato" DatFile="TCList.dat"/>
-</TestFarm>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<TestCase Name="ESPlusplayer API Test" Description="ESPlusplayer APIs unit test" LogFilter="GST_LOG:* TOMATO:* PLUSPLAYER:* STREAMING_ENGINE:*">
- <Procedure Number="1" Description="ESPlusplayer unit test">
- <Step Name="ESPlusplayer unit test" Type="EXT_TEST_PACKAGE" Command="GTEST_TOTAL_SHARDS=1 GTEST_SHARD_INDEX=0 /usr/bin/esplusplayer_ut --gtest_output=xml:/usr/etc/esplusplayer_tests_result.xml" Permission="ROOT">
- <Input Expirytime="10800"/>
- <Output Type="DetectFile" FilePath="/usr/etc/esplusplayer_tests_result.xml"/>
- </Step>
- </Procedure>
-</TestCase>
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
-SET(${fw_name}_CXXFLAGS "-Wall -Werror -std=c++11 -pthread -fPIE -Wl,-z,relro -fstack-protector -fno-delete-null-pointer-checks -DEFL_BETA_API_SUPPORT")
-
+SET(${fw_name}_CXXFLAGS "-Wno-pessimizing-move -Wall -Werror -std=c++11 -pthread -fPIE -Wl,-z,relro -fstack-protector -fno-delete-null-pointer-checks -DEFL_BETA_API_SUPPORT")
SET(${fw_name}_LDFLAGS)
-IF(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
SET(ADD_LIBS
"espplayer-core"
"trackrenderer"
"esplusplayer"
- "mixer"
"gstvideo-1.0"
)
-ELSE(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
-SET(ADD_LIBS
- "espplayer-core"
- "trackrenderer"
- "esplusplayer"
- "gstvideo-1.0"
-)
-ENDIF(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
-SET(dependents "gstreamer-1.0 glib-2.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 dlog gtest_gmock"
+
+SET(dependents "gstreamer-1.0 glib-2.0 gstreamer-plugins-base-1.0 gstreamer-app-1.0 dlog gmock"
"boost"
- "tv-resource-information tv-resource-manager libresourced appcore-efl elementary ecore evas ecore-wl2"
- "capi-media-player"
- "video-capture libturbojpeg libjpeg opencv"
- "audio-control"
+ "appcore-efl elementary ecore evas ecore-wl2"
)
INCLUDE(FindPkgConfig)
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/src/plusplayer-core/include_internal
${PROJECT_SOURCE_DIR}/src/esplusplayer/include_internal
- ${PROJECT_SOURCE_DIR}/src/mixer/include_internal
)
+include_directories(${PROJECT_SOURCE_DIR}/src/include_internal)
+include_directories(/usr/include/gtest)
+include_directories(/usr/include/gstreamer-1.0)
+include_directories(/usr/include/glib-2.0)
+include_directories(/usr/lib/glib-2.0/include)
+include_directories(/usr/include/eo-1)
+include_directories(/usr/include/evas-1)
+include_directories(/usr/include/emile-1)
+include_directories(/usr/include/ecore-1)
+include_directories(/usr/include/ecore-wl2-1)
+include_directories(/usr/include/eina-1)
+include_directories(/usr/include/eina-1/eina)
+include_directories(/usr/include/efl-1)
+include_directories(/usr/include/dlog)
+include_directories(/usr/include/ecore-wayland-1)
+include_directories(/usr/include/elementary-1)
+include_directories(/usr/include/eet-1)
+include_directories(/usr/include/ecore-evas-1)
+include_directories(/usr/include/ecore-file-1)
+include_directories(/usr/include/ecore-input-1)
+include_directories(/usr/include/ecore-imf-1)
+include_directories(/usr/include/ecore-con-1)
+include_directories(/usr/include/edje-1)
+include_directories(/usr/include/efreet-1)
+include_directories(/usr/include/ethumb-client-1)
+include_directories(/usr/include/ethumb-1)
FILE(GLOB UT_SRC
src/plusplayer/*.cpp
+ src/esplusplayer/*.cpp
src/ut_main.cpp
)
-IF(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
-SET(UT_MIXER_SRC
- src/mixer/constant.cpp
- src/mixer/matcher.cpp
- src/mixer/ut_mixer_capi.cpp
- src/mixer/ut_mixer_espp_capi.cpp
- src/mixer/ut_mixer.cpp
- src/mixer/ut_mixerticket.cpp
-# src/mixer/ut_mixerscenario.cpp
- src/mixer/ut_espp_mixerscenario.cpp
- src/mixer/ut_mixedframe.cpp
- src/mixer/ut_renderer.cpp
- src/mixer/ut_tizenbuffermgr.cpp
- src/mixer/ut_tizenbufferobj.cpp
- src/mixer/ut_videoplane.cpp
-)
-#ADD_EXECUTABLE(${fw_name} ${UT_SRC} ${UT_MIXER_SRC})
-#ELSE(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
-#ADD_EXECUTABLE(${fw_name} ${UT_SRC})
-ENDIF(${PRODUCT_TYPE_AUDIO} STREQUAL "no")
ADD_EXECUTABLE(${fw_name} ${UT_SRC})
LINK_DIRECTORIES(${LIB_INSTALL_DIR})
+++ /dev/null
-**GTest guide** \r
-===============\r
- For unit test for plusplayer\r
-\r
----\r
-### Reference \r
-- <https://github.com/google/googletest>\r
-\r
-## Assertion \r
-* ASSERT_* : 실패시 해당 테스트를 바로 종료 <br>\r
-* EXPECT_* : 실패하여도 테스트 계속 진행 <br>\r
-\r
-#### Basic Assertions ###\r
-\r
-These assertions do basic true/false condition testing.\r
-\r
-| **Fatal assertion** | **Nonfatal assertion** | **Verifies** |\r
-|:--------------------|:-----------------------|:-------------|\r
-| `ASSERT_TRUE(`_condition_`)`; | `EXPECT_TRUE(`_condition_`)`; | _condition_ is true |\r
-| `ASSERT_FALSE(`_condition_`)`; | `EXPECT_FALSE(`_condition_`)`; | _condition_ is false |\r
-\r
-#### Binary Comparison ###\r
-\r
-This section describes assertions that compare two values.\r
-\r
-| **Fatal assertion** | **Nonfatal assertion** | **Verifies** |\r
-|:--------------------|:-----------------------|:-------------|\r
-|`ASSERT_EQ(`_val1_`, `_val2_`);`|`EXPECT_EQ(`_val1_`, `_val2_`);`| _val1_ `==` _val2_ |\r
-|`ASSERT_NE(`_val1_`, `_val2_`);`|`EXPECT_NE(`_val1_`, `_val2_`);`| _val1_ `!=` _val2_ |\r
-|`ASSERT_LT(`_val1_`, `_val2_`);`|`EXPECT_LT(`_val1_`, `_val2_`);`| _val1_ `<` _val2_ |\r
-|`ASSERT_LE(`_val1_`, `_val2_`);`|`EXPECT_LE(`_val1_`, `_val2_`);`| _val1_ `<=` _val2_ |\r
-|`ASSERT_GT(`_val1_`, `_val2_`);`|`EXPECT_GT(`_val1_`, `_val2_`);`| _val1_ `>` _val2_ |\r
-|`ASSERT_GE(`_val1_`, `_val2_`);`|`EXPECT_GE(`_val1_`, `_val2_`);`| _val1_ `>=` _val2_ |\r
-\r
-\r
-#### String Comparison ###\r
-\r
-The assertions in this group compare two **C strings**.<br>\r
-If you want to compare two `string` objects, use `EXPECT_EQ`, `EXPECT_NE`, and etc instead.\r
-\r
-| **Fatal assertion** | **Nonfatal assertion** | **Verifies** |\r
-|:--------------------|:-----------------------|:-------------|\r
-| `ASSERT_STREQ(`_str1_`, `_str2_`);` | `EXPECT_STREQ(`_str1_`, `_str_2`);` | the two C strings have the same content |\r
-| `ASSERT_STRNE(`_str1_`, `_str2_`);` | `EXPECT_STRNE(`_str1_`, `_str2_`);` | the two C strings have different content |\r
-| `ASSERT_STRCASEEQ(`_str1_`, `_str2_`);`| `EXPECT_STRCASEEQ(`_str1_`, `_str2_`);` | the two C strings have the same content, ignoring case |\r
-| `ASSERT_STRCASENE(`_str1_`, `_str2_`);`| `EXPECT_STRCASENE(`_str1_`, `_str2_`);` | the two C strings have different content, ignoring case |\r
-\r
-## Text Fixtures : Using the Same Data Configuration for Multiple Tests ##\r
-\r
-사용자가 유사한 data를 사용해서 하나 이상의 test를 작성한다면, test fixture를 사용할 수 있다. 이 test fixture를 사용한다는 것은 여러개의 다양한 test를 작성하는 과정에서 같은 object의 configuration을 재사용한다는 것을 의미한다.\r
-\r
-Fixture를 작성할 때에는 아래의 내용대로 수행하면 된다.\r
-\r
-1. ::testing::Test 로부터 class를 derive한다. Sub-class 에서 fixture member에 접근해야 하기 때문에 protected 혹은 public 으로 작성해야 한다. \r
-2. Class 내부에서 사용자가 원하는대로 object들을 선언해 사용한다. \r
-3. 필요하다면, 생성자나 SetUp() function을 작성해둔다. \r
-4. 생성자나 SetUp() function을 정의해서 사용하고 있다면, 해당 function에서 사용했던 resource를 반환하기 위해 소멸자나 TearDown() function을 작성한다. \r
-5. Subroutine 들을 작성한다. \r
-\r
-Fixture를 사용하기 위해서는 TEST() 대신에 TEST_F()를 사용해야만 한다.\r
-TEST()에서는 첫번째 argument가 testcase의 이름이었지만 TEST_F()를 사용할 때는 첫번째 argument로 test fixture class의 이름을 사용해야만 한다.\r
-\r
-**Fixture class 기본 구현 Form**\r
-* 관례에 따라 테스트할 클래스가 Foo라면 이름을 FooTest라고 하는게 좋다.\r
-~~~\r
-class PlusPlayerTest : public ::testing::Test {\r
-public:\r
- PlusPlayerTest(std::string url)\r
- : plusplayer_(nullptr), url_(url)\r
- {\r
- }\r
-\r
- void SetUp() override\r
- {\r
- plusplayer_ = new PlusPlayer();\r
- create(url_);\r
- }\r
-\r
- void TearDown() override\r
- {\r
- destory(plusplayer_);\r
- }\r
-\r
-private:\r
- std::string url_;\r
- PlusPlayer* plusplayer_;\r
-\r
-}\r
-~~~\r
-\r
-**실행 순서** \r
-1. 모든 구글 테스트 플래그 상태를 저장한다. \r
-2. 첫 번째 테스트에 대해 테스트 fixture 객체를 생성한다. \r
-3. 만든 객체를 SetUp()에서 초기화한다. \r
-4. 픽스처 객체에 대해 테스트를 실행한다. \r
-5. TearDown()에서 해당 픽스처를 정리한다. \r
-6. 해당 픽스처를 삭제한다. \r
-7. 모든 구글 테스트 플래그 상태를 복원한다. \r
-8. 모든 테스트를 마칠 때까지 다음 테스트에 대해 위 과정을 반복한다. \r
-\r
----\r
-\r
-## Arguments \r
-reference\r
-\r
-1. test selection\r
- * --gtest_list_tests <br>\r
- > 테스트할 항목을 보여준다. (테스트 실시 X)\r
- * --gtest_also_run_disabled_tests <br>\r
- > DISABLED_ 로 막아둔 test case 를 일시적으로 실행\r
- * --gtest_filter <br>\r
- > 특정 case 들만 실행 가능<br>\r
- Ex) --gtest_filter="*.create*" : 모든 TC중에서 create 로 시작하는 모든 TC 실행. <br>\r
-\r
-2. test Execution\r
- * --gtest_repeat <br>\r
- > test 반복 가능. -1일 경우 무한히 반복<br>\r
- --gtest_break_on_failure와 함께 사용하면 실패할 경우 멈춤.\r
- * --gtest_shuffle <br>\r
- > 무작위로 실행 가능 (test case 간 dependency 가 없어야 하기 때문이다)<br>\r
- gtest는 기본적으로 현재시간을 랜덤함수의 시드값으로 사용하나, --gtest_random_seed로 조절가능하다\r
- * --gtest_random_seed \r
- > 1 ~ 99999까지의 값을 --gtest_shuffle에서 사용할 랜덤함수의 시드로 사용.\r
-\r
----\r
-## Reference\r
- * Gtest Primer(EN)<br> <https://github.com/google/googletest/blob/master/googletest/docs/Primer.md>\r
-//\r
-// @ Copyright [2018] <S/W Platform, Visual Display, Samsung Electronics>\r
-//\r
-\r
-#ifndef __PLUSPLAYER_UT_INCLUDE_ES_READER_H__\r
-#define __PLUSPLAYER_UT_INCLUDE_ES_READER_H__\r
-\r
-\r
-#include <string>\r
-#include <fstream>\r
-\r
-#include "esplusplayer_capi/esplusplayer_capi.h"\r
-\r
-static const std::string tc_root_dir = "/tmp/esdata/";\r
-\r
-class EsStreamReader {\r
- public:\r
- explicit EsStreamReader(const std::string dirpath,\r
- esplusplayer_stream_type type) {\r
- dir_path_ = tc_root_dir + dirpath;\r
- es_data_file_ = dir_path_ + "ESP.es";\r
- es_info_file_ = dir_path_ + "ESP.info";\r
- extra_codec_file_ = dir_path_ + "ESP.codec_extradata";\r
- type_ = type;\r
- std::cout << "ES data file " << es_data_file_ << std::endl;\r
- }\r
- ~EsStreamReader() {\r
- if (stream_.is_open()) {\r
- stream_.close();\r
- }\r
- }\r
-\r
- bool SetStreamInfo(esplusplayer_handle& esplayer) {\r
- if (type_ == ESPLUSPLAYER_STREAM_TYPE_AUDIO) {\r
- esplusplayer_audio_stream_info audio_stream;\r
- audio_stream.codec_data = nullptr;\r
- audio_stream.codec_data_length = 0;\r
- GetExtraData_(audio_stream.codec_data, audio_stream.codec_data_length);\r
- if (!GetMediaInfo_(audio_stream)) {\r
- if (audio_stream.codec_data != nullptr)\r
- delete []audio_stream.codec_data;\r
- return false;\r
- }\r
-\r
- esplusplayer_set_audio_stream_info(esplayer, &audio_stream);\r
- if (audio_stream.codec_data != nullptr)\r
- delete []audio_stream.codec_data;\r
- } else if (type_ == ESPLUSPLAYER_STREAM_TYPE_VIDEO) {\r
- esplusplayer_video_stream_info video_stream;\r
- video_stream.codec_data = nullptr;\r
- video_stream.codec_data_length = 0;\r
- GetExtraData_(video_stream.codec_data, video_stream.codec_data_length);\r
- if (!GetMediaInfo_(video_stream)) {\r
- if (video_stream.codec_data != nullptr)\r
- delete []video_stream.codec_data;\r
- return false;\r
- }\r
- esplusplayer_set_video_stream_info(esplayer, &video_stream);\r
- if (video_stream.codec_data != nullptr)\r
- delete []video_stream.codec_data;\r
- }\r
- return true;\r
- }\r
-\r
- bool ReadNextPacket(esplusplayer_es_packet& pkt) {\r
- if (!stream_.is_open()) {\r
- stream_ = std::ifstream(es_data_file_, std::ifstream::binary);\r
- if (!stream_.is_open()) return false;\r
- }\r
- if (stream_.eof() || GetFileLeftSize_() < 24) {\r
- std::cout << type_ << " stream EOF" << std::endl;\r
- return false;\r
- }\r
- pkt.type = type_;\r
- std::uint64_t size;\r
- stream_.read(reinterpret_cast<char*>(&pkt.pts), sizeof(pkt.pts));\r
- pkt.pts = pkt.pts / 1000000; //ns -> ms\r
- stream_.read(reinterpret_cast<char*>(&pkt.duration), sizeof(pkt.duration));\r
- pkt.duration = pkt.duration / 1000000; //ns -> ms\r
- stream_.read(reinterpret_cast<char*>(&size), sizeof(size));\r
- pkt.buffer_size = static_cast<uint32_t>(size);\r
- if (pkt.buffer_size == 0) return false;\r
- pkt.buffer = new char[pkt.buffer_size];\r
- stream_.read(reinterpret_cast<char*>(pkt.buffer), pkt.buffer_size);\r
- pkt.matroska_color_info = nullptr;\r
- // std::cout << "Read audio/video buffer: " << type_ << std::endl;\r
- // std::cout << "Type: " << type_ << "Pts: " << pkt.pts << "duration: " <<\r
- // pkt.duration << "size: " << size << std::endl;\r
- if (pkt.pts > 10000) return false; //max buffer 10sec\r
- return true;\r
- }\r
-\r
- void ResetReader() {\r
- stream_.seekg(0,std::ios::beg);\r
- }\r
-\r
-private:\r
- int GetFileLeftSize_(void) {\r
- if (!stream_.is_open()) return 0;\r
- int cur = stream_.tellg();\r
- stream_.seekg(0, stream_.end);\r
- int total = stream_.tellg();\r
- stream_.seekg(cur);\r
- return total - cur;\r
- }\r
- bool GetExtraData_(char*& data, unsigned int& size) {\r
- auto stream = std::ifstream(extra_codec_file_, std::ifstream::binary);\r
- if (!stream.is_open()) return false;\r
- stream.read(reinterpret_cast<char*>(&size), sizeof(size));\r
- if (size == 0) return false;\r
- data = new char[size];\r
- stream.read(data, size);\r
- stream.close();\r
- return true;\r
- }\r
-\r
- bool GetMediaInfo_(esplusplayer_video_stream_info& info) {\r
- auto stream = std::ifstream(es_info_file_, std::ifstream::in);\r
- if (!stream.is_open()) {\r
- std::cout << "No video es file: " << es_info_file_ << std::endl;\r
- return false;\r
- }\r
-\r
- uint32_t mime_type;\r
- stream >> mime_type >> info.width >> info.height >> info.max_width >> info.max_height >>\r
- info.framerate_num >> info.framerate_den;\r
- info.mime_type = static_cast<esplusplayer_video_mime_type>(mime_type);\r
- std::cout << "mime_type: " << info.mime_type << std::endl;\r
- std::cout << "info.width: " << info.width << std::endl;\r
- stream.close();\r
- return true;\r
- }\r
-\r
- bool GetMediaInfo_(esplusplayer_audio_stream_info& info) {\r
- auto stream = std::ifstream(es_info_file_, std::ifstream::in);\r
- if (!stream.is_open()) {\r
- std::cout << "No audio es file: " << es_info_file_ << std::endl;\r
- return false;\r
- }\r
- uint32_t mime_type;\r
- stream >> mime_type >> info.sample_rate >> info.channels;\r
- info.mime_type = static_cast<esplusplayer_audio_mime_type>(mime_type);\r
- std::cout << "mime_type: " << info.mime_type << std::endl;\r
- std::cout << "info.sample_rate: " << info.sample_rate << std::endl;\r
- stream.close();\r
- return true;\r
- }\r
-\r
-\r
-\r
- private:\r
- std::string dir_path_;\r
- std::string es_data_file_;\r
- std::string es_info_file_;\r
- std::string extra_codec_file_;\r
- std::ifstream stream_;\r
- esplusplayer_stream_type type_;\r
-};\r
-\r
-#endif // __PLUSPLAYER_UT_INCLUDE_ES_READER_H__
\ No newline at end of file
+//
+// @ Copyright [2018] <S/W Platform, Visual Display, Samsung Electronics>
+//
+
+#ifndef __PLUSPLAYER_UT_INCLUDE_ES_READER_H__
+#define __PLUSPLAYER_UT_INCLUDE_ES_READER_H__
+
+#include <glib.h>
+#include <string>
+#include <fstream>
+
+#include "esplusplayer_capi/esplusplayer_capi.h"
+
+typedef enum {
+ NAL_SLICE_NO_PARTITIONING = 1,
+ NAL_SLICE_PART_A,
+ NAL_SLICE_PART_B,
+ NAL_SLICE_PART_C,
+ NAL_SLICE_IDR,
+ NAL_SEI,
+ NAL_SEQUENCE_PARAMETER_SET,
+ NAL_PICTURE_PARAMETER_SET,
+ NAL_PICTURE_DELIMITER,
+ NAL_END_OF_SEQUENCE,
+ NAL_END_OF_STREAM,
+ NAL_FILLER_DATA,
+ NAL_PREFIX_SVC = 14
+} nal_unit_type;
+
+#define ES_DEFAULT_VIDEO_PTS_OFFSET 42
+#define ES_DEFAULT_VIDEO_FPS 24
+
+#define ES_DEFAULT_AUDIO_PTS_OFFSET 23
+
+static const std::string tc_root_dir = "/home/owner/";
+
+class EsStreamReader {
+ public:
+ explicit EsStreamReader(const std::string dirpath,
+ esplusplayer_stream_type type) {
+ dir_path_ = tc_root_dir + dirpath;
+ es_data_file_ = dir_path_ + "ESP.es";
+ es_info_file_ = dir_path_ + "ESP.info";
+ extra_codec_file_ = dir_path_ + "ESP.codec_extradata";
+ type_ = type;
+ std::cout << "ES data file " << es_data_file_ << std::endl;
+ }
+ ~EsStreamReader() {
+ if (stream_.is_open()) {
+ stream_.close();
+ }
+ }
+
+ bool SetStreamInfo(esplusplayer_handle& esplayer) {
+ if (type_ == ESPLUSPLAYER_STREAM_TYPE_AUDIO) {
+ esplusplayer_audio_stream_info audio_stream;
+ audio_stream.codec_data = nullptr;
+ audio_stream.codec_data_length = 0;
+ GetExtraData_(audio_stream.codec_data, audio_stream.codec_data_length);
+ if (!GetMediaInfo_(audio_stream)) {
+ if (audio_stream.codec_data != nullptr)
+ delete audio_stream.codec_data;
+ return false;
+ }
+
+ esplusplayer_set_audio_stream_info(esplayer, &audio_stream);
+ if (audio_stream.codec_data != nullptr)
+ delete audio_stream.codec_data;
+ } else if (type_ == ESPLUSPLAYER_STREAM_TYPE_VIDEO) {
+ esplusplayer_video_stream_info video_stream;
+ video_stream.codec_data = nullptr;
+ video_stream.codec_data_length = 0;
+ GetExtraData_(video_stream.codec_data, video_stream.codec_data_length);
+ if (!GetMediaInfo_(video_stream)) {
+ if (video_stream.codec_data != nullptr)
+ delete video_stream.codec_data;
+ return false;
+ }
+ esplusplayer_set_video_stream_info(esplayer, &video_stream);
+ if (video_stream.codec_data != nullptr)
+ delete video_stream.codec_data;
+ }
+ return true;
+ }
+
+ bool ReadNextPacket(esplusplayer_es_packet& pkt) {
+ static guint64 pts = 0L;
+ if (!stream_.is_open()) {
+ stream_ = std::ifstream(es_data_file_, std::ifstream::binary);
+ if (!stream_.is_open()) return false;
+ }
+ if (stream_.eof() || GetFileLeftSize_() < 24) {
+ std::cout << type_ << " stream EOF" << std::endl;
+ return false;
+ }
+
+ char* tmp = new char[1000000];
+ pkt.type = type_;
+
+ if (type_ == ESPLUSPLAYER_STREAM_TYPE_VIDEO) {
+ int size = videobytestream2nalunit(tmp);
+
+ if (size <= 0) {
+ return false;
+ delete tmp;
+ }
+
+ pkt.buffer = new char[size];
+ memcpy(pkt.buffer, tmp, size);
+
+ pkt.pts = pts;
+ pkt.duration = ES_DEFAULT_VIDEO_PTS_OFFSET;
+ pkt.buffer_size = size;
+
+ pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
+ } else if (type_ == ESPLUSPLAYER_STREAM_TYPE_AUDIO) {
+ int size = audiobytestream2nalunit(tmp);
+
+ if (size <= 0) {
+ return false;
+ delete tmp;
+ }
+ pkt.buffer = new char[size];
+
+ memcpy(pkt.buffer, tmp, size);
+
+ pkt.pts = pts;
+ pkt.duration = ES_DEFAULT_VIDEO_PTS_OFFSET;
+ pkt.buffer_size = size;
+
+ pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
+ }
+ delete tmp;
+ return true;
+ }
+
+ void ResetReader() {
+ stream_.seekg(0,std::ios::beg);
+ }
+
+private:
+ int videobytestream2nalunit(char *nal)
+ {
+ int nal_length = 0;
+ unsigned int read_size = 1;
+ char buffer[1000000];
+ unsigned char val, zero_count, i;
+ int init = 0;
+ int type = 0;
+
+ do {
+ zero_count = 0;
+
+ stream_.read(buffer, read_size);
+
+ val = buffer[0];
+ nal[nal_length++] = val;
+ while (1) {
+ if ((zero_count == 2 || zero_count == 3) && val == 1)
+ break;
+ zero_count++;
+ stream_.read(buffer, read_size);
+
+ val = buffer[0];
+ nal[nal_length++] = val;
+ }
+
+ zero_count = 0;
+ init = 1;
+
+ while (1) {
+ if (stream_.eof())
+ return -1;
+
+ stream_.read(buffer, read_size);
+
+ val = buffer[0];
+
+ if (init) {
+ type = val & 0x1F;
+ init = 0;
+ }
+
+ if (!val) {
+ zero_count++;
+ } else {
+ if ((zero_count == 2 || zero_count == 3 || zero_count == 4)
+ && (val == 1)) {
+ break;
+ } else {
+ for (i = 0; i < zero_count; i++)
+ nal[nal_length++] = 0;
+ nal[nal_length++] = val;
+ zero_count = 0;
+ }
+ }
+ }
+
+ stream_.seekg(-(zero_count + 1), std::ios::cur);
+ } while (type == NAL_SEI ||
+ type == NAL_SEQUENCE_PARAMETER_SET ||
+ type == NAL_PICTURE_PARAMETER_SET ||
+ type == NAL_PICTURE_DELIMITER);
+
+
+ return nal_length;
+ }
+
+ int audiobytestream2nalunit(char *nal)
+ {
+ const int HEADER_SIZE = 7;
+ int nal_length = 0;
+ int audio_data_length = 0;
+
+ if (nal == NULL || stream_.eof())
+ return -1;
+
+ stream_.read(nal, HEADER_SIZE);
+
+ nal_length = static_cast<int>(((nal[4] << 3) & 0x7ff)
+ + (((nal[5] - 0x1f) >> 5) & 0x7));
+
+ audio_data_length = nal_length - HEADER_SIZE;
+ stream_.read(nal + HEADER_SIZE, audio_data_length);
+
+ return nal_length;
+ }
+ int GetFileLeftSize_(void) {
+ if (!stream_.is_open()) return 0;
+ int cur = stream_.tellg();
+ stream_.seekg(0, stream_.end);
+ int total = stream_.tellg();
+ stream_.seekg(cur);
+ return total - cur;
+ }
+ bool GetExtraData_(char*& data, unsigned int& size) {
+ auto stream = std::ifstream(extra_codec_file_, std::ifstream::binary);
+ if (!stream.is_open()) return false;
+ stream.read(reinterpret_cast<char*>(&size), sizeof(size));
+ if (size == 0) return false;
+ data = new char[size];
+ stream.read(data, size);
+ stream.close();
+ return true;
+ }
+
+ bool GetMediaInfo_(esplusplayer_video_stream_info& info) {
+ auto stream = std::ifstream(es_info_file_, std::ifstream::in);
+ if (!stream.is_open()) {
+ std::cout << "No video es file: " << es_info_file_ << std::endl;
+ return false;
+ }
+
+ uint32_t mime_type;
+ stream >> mime_type >> info.width >> info.height >> info.max_width >> info.max_height >>
+ info.framerate_num >> info.framerate_den;
+ info.mime_type = static_cast<esplusplayer_video_mime_type>(mime_type);
+ std::cout << "mime_type: " << info.mime_type << std::endl;
+ std::cout << "info.width: " << info.width << std::endl;
+ stream.close();
+ return true;
+ }
+
+ bool GetMediaInfo_(esplusplayer_audio_stream_info& info) {
+ auto stream = std::ifstream(es_info_file_, std::ifstream::in);
+ if (!stream.is_open()) {
+ std::cout << "No audio es file: " << es_info_file_ << std::endl;
+ return false;
+ }
+ uint32_t mime_type;
+ stream >> mime_type >> info.sample_rate >> info.channels;
+ info.mime_type = static_cast<esplusplayer_audio_mime_type>(mime_type);
+ std::cout << "mime_type: " << info.mime_type << std::endl;
+ std::cout << "info.sample_rate: " << info.sample_rate << std::endl;
+ stream.close();
+ return true;
+ }
+
+
+
+ private:
+ std::string dir_path_;
+ std::string es_data_file_;
+ std::string es_info_file_;
+ std::string extra_codec_file_;
+ std::ifstream stream_;
+ esplusplayer_stream_type type_;
+};
+
+#endif // __PLUSPLAYER_UT_INCLUDE_ES_READER_H__
std::vector<std::string> tc_list = {
es_h264_aac,
//es_hevc_ac3,
- es_vp9_opus,
+ //es_vp9_opus,
};
}
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_CONSTANT_H__
-#define __PLUSPLAYER_MIXER_UT_CONSTANT_H__
-
-#include <tbm_type.h>
-
-#include <cstdint>
-#include <type_traits>
-
-#include "mixer/mixer.h"
-#include "mixer/types/buffertype.h"
-#include "mixer/types/planecomponent.h"
-#include "mixer/types/videoplanemanipinfo.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer_ut {
-using namespace plusplayer;
-
-VideoPlaneManipulableInfo GetVideoPlaneManipulableInfo(
- BufferHandleType handle, const PlaneComponent& comp,
- const std::uint32_t& linesize, const Geometry& geom);
-
-Geometry GetGeometry(const int& x, const int& y, const int& w, const int& h);
-
-CropArea GetCropArea(const double& x, const double& y, const double& w,
- const double& h);
-
-Mixer::ResolutionInfo GetResolutionInfo(int width, int height, int fnum,
- int fden);
-
-static const std::uint32_t kDefaultWidth = 1920;
-static const std::uint32_t kDefaultHeight = 1080;
-static const std::uint32_t kSmallWidth = 192;
-static const std::uint32_t kSmallHeight = 108;
-static const std::uint32_t kInvalidWidth = 0;
-static const std::uint32_t kInvalidHeight = 0;
-static const std::uint32_t kExpectedDefaultByteSize =
- (kDefaultWidth * kDefaultHeight * 3) >> 1;
-
-static const std::uint32_t kDefaultFramerateNum = 30;
-static const std::uint32_t kDefaultFramerateDen = 1;
-static const std::uint32_t kFastFramerateNum = 60;
-static const std::uint32_t kFastFramerateDen = 1;
-static const std::uint32_t kInvalidFramerateNum = 0;
-static const std::uint32_t kInvalidFramerateDen = 0;
-
-static const std::uint32_t kDefaultX = 10;
-static const std::uint32_t kDefaultY = 20;
-static const std::uint32_t kDefaultW = 30;
-static const std::uint32_t kDefaultH = 40;
-
-static const std::uint32_t kDefaultLineSize = kDefaultWidth;
-static const BufferHandleType kDefaultBufferHandle = 1;
-static const BufferHandleType kInvalidBufferHandle = 0;
-static const BufferKeyType kDefaultBufferKey = 1;
-static const BufferKeyType kInvalidBufferKey = 0;
-
-extern BufferDefaultType kDefaultBuffer;
-extern BufferUnionHandleType kDefaultMappedHandle;
-
-static const auto kYComponentSrcVMInfo = GetVideoPlaneManipulableInfo(
- kDefaultBufferHandle, PlaneComponent::kYComponent, kDefaultLineSize,
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH));
-static const auto kUVComponentSrcVMInfo = GetVideoPlaneManipulableInfo(
- kDefaultBufferHandle, PlaneComponent::kUVComponent, kDefaultLineSize,
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH));
-
-static const auto kYComponentDestVMInfo = GetVideoPlaneManipulableInfo(
- kDefaultBufferHandle, PlaneComponent::kYComponent, kDefaultLineSize,
- GetGeometry(0, 0, kDefaultWidth, kDefaultHeight));
-static const auto kUVComponentDestVMInfo = GetVideoPlaneManipulableInfo(
- kDefaultBufferHandle, PlaneComponent::kUVComponent, kDefaultLineSize,
- GetGeometry(0, kDefaultHeight, kDefaultWidth >> 1, kDefaultHeight >> 1));
-
-static const auto kCroppedYComponentDestVMInfo = GetVideoPlaneManipulableInfo(
- kDefaultBufferHandle, PlaneComponent::kYComponent, kDefaultLineSize,
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH));
-static const auto kCroppedUVComponentDestVMInfo = GetVideoPlaneManipulableInfo(
- kDefaultBufferHandle, PlaneComponent::kUVComponent, kDefaultLineSize,
- GetGeometry(kDefaultX >> 1, (kDefaultY >> 1) + kDefaultHeight,
- kDefaultW >> 1, kDefaultH >> 1));
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_CONSTANT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_MATCHER_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_MATCHER_H__
-
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include <memory>
-#include <stdexcept>
-#include <string>
-
-#include "mixer/types/videoplanemanipinfo.h"
-
-namespace plusplayer_ut {
-using namespace plusplayer;
-
-using ::testing::MakeMatcher;
-using ::testing::Matcher;
-using ::testing::MatcherInterface;
-using ::testing::MatchResultListener;
-
-class IsSameVideoPlaneManipulableInfoMatcher
- : public MatcherInterface<const VideoPlaneManipulableInfo&> {
- public:
- explicit IsSameVideoPlaneManipulableInfoMatcher(
- const VideoPlaneManipulableInfo& comparer)
- : comparer_(comparer) {}
- virtual ~IsSameVideoPlaneManipulableInfoMatcher() {}
- bool MatchAndExplain(const VideoPlaneManipulableInfo& info,
- MatchResultListener* listener) const override {
- if (info.handle != comparer_.handle) {
- *listener << "handle: " << info.handle << " vs " << comparer_.handle;
- return false;
- }
- if (info.component != comparer_.component) {
- *listener << "component: " << static_cast<int>(info.component) << " vs "
- << static_cast<int>(comparer_.component);
- return false;
- }
- if (info.linesize != comparer_.linesize) {
- *listener << "linesize: " << info.linesize << " vs "
- << comparer_.linesize;
- return false;
- }
- if (info.rect.x != comparer_.rect.x) {
- *listener << "rect.x: " << info.rect.x << " vs " << comparer_.rect.x;
- return false;
- }
- if (info.rect.y != comparer_.rect.y) {
- *listener << "rect.y: " << info.rect.y << " vs " << comparer_.rect.y;
- return false;
- }
- if (info.rect.w != comparer_.rect.w) {
- *listener << "rect.w: " << info.rect.w << " vs " << comparer_.rect.w;
- return false;
- }
- if (info.rect.h != comparer_.rect.h) {
- *listener << "rect.h: " << info.rect.h << " vs " << comparer_.rect.h;
- return false;
- }
- return true;
- }
-
- void DescribeTo(std::ostream* os) const override {
- *os << "is same with your param";
- }
-
- void DescribeNegationTo(std::ostream* os) const override {
- *os << "is not same";
- }
-
- private:
- const VideoPlaneManipulableInfo& comparer_;
-};
-
-Matcher<const VideoPlaneManipulableInfo&> IsSameVideoPlaneManipulableInfo(
- const VideoPlaneManipulableInfo& comparer);
-} // namespace plusplayer_ut
-
-using ::testing::PrintToString;
-
-template <typename... Args>
-std::string StringFormat(const std::string& format, Args... args) {
- size_t size = snprintf(nullptr, 0, format.c_str(), args...) +
- 1; // Extra space for '\0'
- if (size <= 0) {
- throw std::runtime_error("Error during formatting.");
- }
- std::unique_ptr<char[]> buf(new char[size]);
- snprintf(buf.get(), size, format.c_str(), args...);
- return std::string(buf.get(),
- buf.get() + size - 1); // We don't want the '\0' inside
-}
-
-MATCHER_P(IsSameGeometry, geom,
- StringFormat("%s in (x, y, w, h) [%d, %d, %d, %d]",
- negation ? "isn't" : "is", geom.x, geom.y, geom.w,
- geom.h)) {
- if (geom.x != arg.x) return false;
- if (geom.y != arg.y) return false;
- if (geom.w != arg.w) return false;
- if (geom.h != arg.h) return false;
- return true;
-}
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_MATCHER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_FAKE_BUFFER_H__
-#define __PLUSPLAYER_MIXER_UT_FAKE_BUFFER_H__
-
-#include <gmock/gmock.h>
-
-#include <cstdint>
-#include <memory>
-
-using ::testing::MakePolymorphicAction;
-using ::testing::PolymorphicAction;
-
-namespace plusplayer_ut {
-struct FakeBuffer {
- FakeBuffer(const std::uint32_t& size)
- : ptr(std::unique_ptr<char[]>(new char[size])), size(size) {}
- std::unique_ptr<char[]> ptr = nullptr;
- const std::uint32_t size = 0;
-};
-using FakeBufferPtr = std::unique_ptr<FakeBuffer>;
-
-class CreateFakeBufferAction {
- public:
- explicit CreateFakeBufferAction(FakeBufferPtr& buffer) : buffer_(buffer) {}
- template <typename Result, typename ArgumentTuple>
- Result Perform(const ArgumentTuple& args) const {
- auto size = std::get<0>(args);
- if (size == 0) return;
- buffer_.reset(new FakeBuffer(size));
- }
-
- private:
- FakeBufferPtr& buffer_;
-};
-
-static PolymorphicAction<CreateFakeBufferAction> CreateFakeBuffer(
- FakeBufferPtr& buffer) {
- return MakePolymorphicAction(CreateFakeBufferAction(buffer));
-}
-
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_FAKE_BUFFER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_BUFFER_OBJECT_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_BUFFER_OBJECT_H__
-
-#include <gmock/gmock.h>
-
-#include "mixer/constant.h"
-#include "mixer/interfaces/accessiblebuffer.h"
-#include "mixer/interfaces/bufferobject.h"
-#include "mixer/mock/movable.h"
-
-namespace plusplayer_ut {
-using namespace plusplayer;
-class MockBufferObject : public BufferObject {
- public:
- MOCK_CONST_METHOD0(GetBufferHandle, BufferHandleType());
- MOCK_CONST_METHOD0(Export, BufferKeyType());
- MOCK_CONST_METHOD0(GetSize, std::uint32_t());
-};
-
-class MockAccessibleBufferObject : public BufferObject,
- public AccessibleBuffer {
- public:
- MOCK_CONST_METHOD0(GetReadableAddress_, Mover<PhyAddrAccessorPtr>());
- MOCK_CONST_METHOD0(GetWritableAddress_, Mover<PhyAddrAccessorPtr>());
- MOCK_CONST_METHOD0(GetBufferHandle, BufferHandleType());
- MOCK_CONST_METHOD0(Export, BufferKeyType());
- MOCK_CONST_METHOD0(GetSize, std::uint32_t());
- PhyAddrAccessorPtr GetReadableAddress() const {
- return std::move(GetReadableAddress_().get());
- }
- PhyAddrAccessorPtr GetWritableAddress() const {
- return std::move(GetWritableAddress_().get());
- }
-};
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_BUFFER_OBJECT_H__
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_MEMORY_ALLOCATOR_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_MEMORY_ALLOCATOR_H__
-
-#include <gmock/gmock.h>
-
-#include "mixer/constant.h"
-#include "mixer/interfaces/memoryallocator.h"
-
-namespace plusplayer_ut {
-using namespace plusplayer;
-class MockMemoryAllocator : public MemoryAllocator {
- public:
- MOCK_CONST_METHOD1(Allocate, BufferObject*(const std::uint32_t&));
-};
-} // namespace plusplayer_ut
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_MEMORY_ALLOCATOR_H__
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_PHYSICAL_ADDRESS_ACCESSOR_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_PHYSICAL_ADDRESS_ACCESSOR_H__
-
-#include <gmock/gmock.h>
-
-#include "mixer/interfaces/phyaddraccessor.h"
-
-namespace plusplayer {
-class MockPhyAddrAccessor : public PhysicalAddressAccessor {
- public:
- virtual ~MockPhyAddrAccessor() = default;
- MOCK_METHOD0(GetAddress, BufferPhysicalAddrType());
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_PHYSICAL_ADDRESS_ACCESSOR_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_RENDERABLE_OBJECT_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_RENDERABLE_OBJECT_H__
-
-#include <gmock/gmock.h>
-
-#include <cstdint>
-#include <memory>
-#include <vector>
-
-#include "mixer/constant.h"
-#include "mixer/interfaces/renderableobject.h"
-#include "mixer/interfaces/videoplanemanipulator.h"
-#include "mixer/types/videoplanemanipinfo.h"
-#include "plusplayer/types/display.h"
-
-namespace plusplayer_ut {
-
-class MockRenderableObject : public RenderableObject {
- public:
- MOCK_CONST_METHOD0(GetVideoPlaneManipInfo,
- const std::vector<VideoPlaneManipulableInfo>());
- MOCK_CONST_METHOD0(IsValid, bool());
- MOCK_CONST_METHOD0(GetWidth, std::uint32_t());
- MOCK_CONST_METHOD0(GetHeight, std::uint32_t());
- MOCK_CONST_METHOD0(GetSize, std::uint32_t());
- MOCK_METHOD3(Render, bool(const VideoPlaneManipulator* const,
- const std::vector<VideoPlaneManipulableInfo>&,
- const Geometry&));
- MOCK_METHOD4(Fill, bool(const VideoPlaneColorManipulator* const,
- const PlaneComponent&, const std::uint32_t&,
- const Geometry&));
- MOCK_CONST_METHOD1(Export, bool(BufferKeyType&));
-};
-
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_RENDERABLE_OBJECT_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_RENDERABLE_OBJECT_FACTORY_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_RENDERABLE_OBJECT_FACTORY_H__
-
-#include <gmock/gmock.h>
-
-#include <cstdint>
-
-#include "mixer/constant.h"
-#include "mixer/interfaces/renderableobj_factory.h"
-
-namespace plusplayer_ut {
-class MockRenderableObjectFactory : public RenderableObjectFactory {
- public:
- MOCK_CONST_METHOD2(CreateRenderableObject,
- RenderableObject*(const std::uint32_t width,
- const std::uint32_t height));
-};
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_RENDERABLE_OBJECT_FACTORY_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_RENDERER_EVENT_LISTENER_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_RENDERER_EVENT_LISTENER_H__
-
-#include <gmock/gmock.h>
-
-#include "mixer/constant.h"
-#include "mixer/renderer.h"
-
-namespace plusplayer_ut {
-class MockRendererEventListener : public RendererEventListener {
- public:
- MOCK_METHOD1(OnRenderingRelease, bool(const BufferKeyType&));
-};
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_RENDERER_EVENT_LISTENER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_VIDEOPLANECOLLECTION_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_VIDEOPLANECOLLECTION_H__
-
-#include <gmock/gmock.h>
-
-#include "mixer/constant.h"
-#include "mixer/interfaces/videoplanecollection.h"
-
-namespace plusplayer_ut {
-class MockVideoPlaneCollection : public VideoPlaneCollection {
- public:
- MOCK_CONST_METHOD0(GetVideoPlaneManipInfo,
- const std::vector<VideoPlaneManipulableInfo>());
-};
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_VIDEOPLANECOLLECTION_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_VIDEO_PLANE_MANIPULATOR_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_VIDEO_PLANE_MANIPULATOR_H__
-
-#include <cstdint>
-
-#include "mixer/constant.h"
-#include "mixer/interfaces/videoplanemanipulator.h"
-
-namespace plusplayer_ut {
-using namespace plusplayer;
-
-class MockVideoPlaneManipulator : public VideoPlaneManipulator {
- public:
- MOCK_CONST_METHOD2(Do, bool(const VideoPlaneManipulableInfo&,
- const VideoPlaneManipulableInfo&));
-};
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_VIDEO_PLANE_MANIPULATOR_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_MOCK_VIDEO_PLANE_SCALER_H__
-#define __PLUSPLAYER_MIXER_MOCK_VIDEO_PLANE_SCALER_H__
-
-#include <gmock/gmock.h>
-
-#include "mixer/constant.h"
-#include "mixer/interfaces/videoplanescaler.h"
-
-namespace plusplayer {
-class MockVideoPlaneScaler : public VideoPlaneScaler {
- public:
- virtual ~MockVideoPlaneScaler() = default;
- MOCK_CONST_METHOD0(GetScaleManipulator, const VideoPlaneManipulator* const());
-};
-} // namespace plusplayer
-
-#endif // __PLUSPLAYER_MIXER_MOCK_VIDEO_PLANE_SCALER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_MOVABLE_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_MOVABLE_H__
-
-#include <cassert>
-
-namespace plusplayer_ut {
-
-template <typename T>
-class Mover {
- public:
- Mover(T&& object) : object(std::move(object)), valid(true) {}
-
- Mover(const Mover<T>& other)
- : object(const_cast<T&&>(other.object)), valid(true) {
- assert(other.valid);
- other.valid = false;
- }
-
- Mover& operator=(const Mover& other) {
- assert(other.valid);
- object = const_cast<T&&>(other.object);
- other.valid = false;
- valid = true;
- }
-
- T& get() {
- assert(valid);
- return object;
- }
-
- const T& get() const {
- assert(valid);
- return *object;
- }
-
- private:
- T object;
- mutable bool valid;
-};
-
-template <typename T>
-inline Mover<T> Movable(T&& object) {
- return Mover<T>(std::move(object));
-}
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_MOVABLE_H__
+++ /dev/null
-#ifndef __PLUSPLAYER_MIXER_UT_MOCK_MOVE_OBJECT_WRAPPER_H__
-#define __PLUSPLAYER_MIXER_UT_MOCK_MOVE_OBJECT_WRAPPER_H__
-
-#include <iostream>
-
-namespace plusplayer_ut {
-template <typename T>
-class MoveObjectWrapper {
- public:
- explicit MoveObjectWrapper(T* obj) : obj_(obj) {}
- virtual ~MoveObjectWrapper() {
- if (moved_ == false) {
- delete obj_;
- std::cout << "CALLED dtor" << std::endl;
- }
- }
- MoveObjectWrapper<T>& operator=(T* obj) { obj_ = obj; }
- T& Get() { return *obj_; }
- T* Move() {
- moved_ = true;
- return obj_;
- }
-
- private:
- T* obj_ = nullptr;
- bool moved_ = false;
-};
-} // namespace plusplayer_ut
-
-#endif // __PLUSPLAYER_MIXER_UT_MOCK_MOVE_OBJECT_WRAPPER_H__
\ No newline at end of file
+++ /dev/null
-#ifndef __IMAGESIMILARITY_H_
-#define __IMAGESIMILARITY_H_
-
-class ImageSimilarity {
-
-public:
-/**
- * @brief measuring the similarity of the images using PSNR (Peak Signal-to-Noise Ratio)
- * @remarks
- * @param[in] image1 first image that measures the similarity
- * @param[in] image2 second image that measures the similarity with image1
- * @return Normalized Similarity value (0~100) on success, higher is better.
- * otherwise a negative error value
- * @pre the image1 and image2 should be properly allocated.
- * @post None
- * @exception None
- */
- double CompareImagesWithPSNR(char *reference_image, char *comparison_image);
-
-/**
- * @brief measuring the similarity of tho images using SSIM (Structural Similarity)
- * @remarks MSSIM (Mean of Structureal Similarity)
- * @param[in] image1 first image that measures the similarity
- * @param[in] image2 second image that measures the similarity with image1
- * @return Normalized Similarity value (0~100) on success, higher is better.
- * otherwise a negative error value
- * @pre the image1 and image2 should be properly allocated.
- * @post None
- * @exception None
- */
- double CompareImagesWithMSSIM(char *reference_image, char *comparison_image);
-};
-
-#endif
#include "core/utils/plusplayer_log.h"
#include "esplusplayer_capi/esplusplayer_capi.h"
-#include "mixer_capi/mixer_capi.h"
-//#include "plusplayer/plusplayer.h"
#include "plusplayer/types/display.h"
#include "ut/include/appwindow.h"
#define DEFAULT_TIMEOUT_FOR_SEEKING (25 * 1000)
#define EOS_WAIT_TIME 10000
-class IAudioControl;
-class DiagnosisAudioControl;
-
namespace utils {
class Utility;
using evas_h = Evas_Object*;
const char* GetCurrentTestName(void);
-#ifndef IS_AUDIO_PRODUCT
-
-#if 0
- plusplayer::PlusPlayer::Ptr GetOpenedMixPlusPlayer(std::string& uri,
- plusplayer::Mixer* mixer,
- plusplayer::Geometry& roi);
-
- plusplayer::PlusPlayer::Ptr GetPreparedMixPlusPlayer(
- std::string& uri, plusplayer::Mixer* mixer, plusplayer::Geometry& roi);
-
- plusplayer::PlusPlayer::Ptr GetStartedMixPlusPlayer(
- std::string& uri, plusplayer::Mixer* mixer, plusplayer::Geometry& roi);
-#endif
- esplusplayer_handle GetOpenedMixESPP(mixer_handle mixer,
- plusplayer::Geometry& roi);
-
- esplusplayer_handle GetPreparedMixESPP(std::string& uri, mixer_handle mixer,
- plusplayer::Geometry& roi);
-
- esplusplayer_handle GetStartedMixESPP(std::string& uri, mixer_handle mixer,
- plusplayer::Geometry& roi);
-#endif
esplusplayer_handle GetOpenedESPP(plusplayer::Geometry& roi);
esplusplayer_handle GetPreparedESPP(std::string& uri,
evas_h GetWindow() const;
- int CaptureYUV(int capture_width, int capture_height, char* ybuff,
- char* cbuff, int ysize, int csize,
- std::string result_file_path);
-
- int CaptureJPG(const int capture_width, const int capture_height, char* ybuff,
- char* cbuff, const int ysize, const int csize,
- std::string img_file_path);
-
- int CheckYUV(int x, int y);
- bool IsAudioDisconnected();
- bool IsAudioConnected() {return !IsAudioDisconnected();}
- bool IsAudioMute();
- bool IsAudioUnmute() {return !IsAudioMute();}
-
Utility(const Utility& rhs) = delete;
Utility& operator=(const Utility& rhs) = delete;
private:
std::unique_ptr<plusplayer_ut::AppWindow> appwindow_;
- IAudioControl* audioControl = nullptr;
- DiagnosisAudioControl* audioDiagnoser = nullptr;
};
enum class WatcherStatus {
-//\r
-// @ Copyright [2018] <S/W Platform, Visual Display, Samsung Electronics>\r
-//\r
-\r
-#ifndef __PLUSPLAYER_UT_INCLUDE_ESCOMMON_H__\r
-#define __PLUSPLAYER_UT_INCLUDE_ESCOMMON_H__\r
-\r
-#include <chrono>\r
-#include <cstdlib>\r
-#include <fstream>\r
-#include <memory>\r
-#include <string>\r
-#include <thread>\r
-#include <vector>\r
-\r
-#include "gtest/gtest.h"\r
-\r
-#include "plusplayer/espacket.h"\r
-#include "ut/include/appwindow.h"\r
-\r
-namespace pp = plusplayer;\r
-\r
-namespace utils {\r
-inline bool Exists(const std::string &path) {\r
- std::ifstream ifile(path);\r
- return static_cast<bool>(ifile);\r
-}\r
-} // namespace utils\r
-\r
-namespace {\r
-class Environment {\r
- public:\r
- Environment() {\r
- appwindow_.reset(new plusplayer_ut::AppWindow(0, 0, 1920, 1080));\r
- }\r
- void *Window() { return appwindow_->GetWindow().obj; }\r
- void *EcoreWindow() { return appwindow_->GetEcoreWL2Window(); }\r
-\r
- private:\r
- std::shared_ptr<plusplayer_ut::AppWindow> appwindow_;\r
-};\r
-\r
-class ESPacketDownloader {\r
- public:\r
- static void Init() {\r
- if (utils::Exists("/tmp/esdata")) {\r
- return;\r
- }\r
- std::cout << "Download ESData via http - path : /tmp/esdata" << std::endl;\r
- int ret = std::system(\r
- "/usr/bin/wget "\r
- "--recursive --directory-prefix=/tmp/esdata --force-directories "\r
- "--no-host-directories --cut-dirs=2 --no-parent --reject=index.html "\r
- "");\r
- assert(ret == 0 && "wget is failed, please retry");\r
- }\r
-};\r
-} // namespace\r
-\r
-namespace es {\r
-inline std::uint64_t ConvertNsToMs(std::uint64_t ms) {\r
- constexpr std::uint64_t ns_unit = 1000000;\r
- return ms / ns_unit;\r
-}\r
-struct Packet {\r
- std::uint64_t pts;\r
- std::uint64_t duration;\r
- std::uint64_t size;\r
- std::shared_ptr<char> data;\r
-\r
- pp::EsPacketPtr MakeEsPacket(pp::StreamType type) {\r
- return std::move(\r
- pp::EsPacket::Create(type, data, static_cast<std::uint32_t>(size),\r
- // pts/1000000,duration/1000000));\r
- ConvertNsToMs(pts), ConvertNsToMs(duration)));\r
- }\r
-\r
- static pp::EsPacketPtr MakeEosPacket(pp::StreamType type) {\r
- return std::move(pp::EsPacket::CreateEos(type));\r
- }\r
-};\r
-\r
-struct CodecExtraData {\r
- std::uint32_t size;\r
- std::shared_ptr<char> data;\r
-};\r
-using PacketPtr = std::shared_ptr<Packet>;\r
-using CodecExtraDataPtr = std::shared_ptr<CodecExtraData>;\r
-\r
-template <typename TRACK, typename TRACKTYPE>\r
-struct VideoInfo {\r
- std::string mimetype;\r
- int width, height;\r
- int maxwidth, maxheight;\r
- int framerate_num, framerate_den;\r
-\r
- void ExtractMediaInfoFrom(std::ifstream &stream) {\r
- stream >> mimetype >> width >> height >> maxwidth >> maxheight >>\r
- framerate_num >> framerate_den;\r
- }\r
-\r
- TRACK GetTrack() {\r
- TRACK t;\r
- t.active = true;\r
- t.index = 0;\r
- t.type = TRACKTYPE::kTrackTypeVideo;\r
- t.mimetype = mimetype;\r
- t.width = width;\r
- t.height = height;\r
- t.maxwidth = maxwidth;\r
- t.maxheight = maxheight;\r
- t.framerate_num = framerate_num;\r
- t.framerate_den = framerate_den;\r
- return t;\r
- }\r
-};\r
-\r
-template <typename TRACK, typename TRACKTYPE>\r
-struct AudioInfo {\r
- std::string mimetype;\r
- int samplerate;\r
- int channels;\r
- int version;\r
-\r
- void ExtractMediaInfoFrom(std::ifstream &stream) {\r
- stream >> mimetype >> samplerate >> channels >> version;\r
- }\r
- TRACK GetTrack() {\r
- TRACK t;\r
- t.active = true;\r
- t.index = 0;\r
- t.type = TRACKTYPE::kTrackTypeAudio;\r
- t.mimetype = mimetype;\r
- t.sample_rate = samplerate;\r
- t.channels = channels;\r
- t.version = version;\r
- return t;\r
- }\r
-};\r
-\r
-template <typename TRACKTYPE>\r
-class StreamReader {\r
- public:\r
- using Ptr = std::shared_ptr<StreamReader<TRACKTYPE>>;\r
- friend Ptr;\r
- static Ptr Create(const std::string &dirpath, const TRACKTYPE &type) {\r
- return Ptr(new StreamReader(dirpath, type));\r
- }\r
- virtual ~StreamReader() {\r
- if (stream_.is_open()) {\r
- stream_.close();\r
- }\r
- }\r
-\r
- private:\r
- explicit StreamReader(const std::string dirpath, const TRACKTYPE &type)\r
- : type_(type) {\r
- dirpath_ = "/tmp/esdata/" + dirpath;\r
- if (utils::Exists(dirpath_) == false) {\r
- throw std::runtime_error(dirpath_ + "doesn't exist");\r
- }\r
- stream_ = std::ifstream(dirpath_ + "/ESP.es", std::ifstream::binary);\r
- }\r
-\r
- public:\r
- CodecExtraDataPtr GetExtraData() {\r
- std::string path = dirpath_ + "/ESP.codec_extradata";\r
- auto stream = std::ifstream(path, std::ifstream::binary);\r
- auto extradata = CodecExtraDataPtr(new CodecExtraData);\r
- stream.read(reinterpret_cast<char *>(&extradata->size),\r
- sizeof extradata->size);\r
- using DataPtr = std::shared_ptr<char>;\r
- extradata->data = DataPtr(new char[extradata->size]);\r
- stream.read(reinterpret_cast<char *>(extradata->data.get()),\r
- extradata->size);\r
- stream.close();\r
- return extradata;\r
- }\r
-\r
- PacketPtr ReadNextPacket() {\r
- if (stream_.eof()) {\r
- return nullptr;\r
- }\r
- auto pkt = PacketPtr(new Packet);\r
- stream_.read(reinterpret_cast<char *>(&pkt->pts), sizeof pkt->pts);\r
- stream_.read(reinterpret_cast<char *>(&pkt->duration),\r
- sizeof pkt->duration);\r
- stream_.read(reinterpret_cast<char *>(&pkt->size), sizeof pkt->size);\r
- using DataPtr = std::unique_ptr<char>;\r
- pkt->data = DataPtr(new char[pkt->size]);\r
- stream_.read(reinterpret_cast<char *>(pkt->data.get()), pkt->size);\r
- return pkt;\r
- }\r
-\r
- template <typename T>\r
- T GetMediaInfo() {\r
- std::string path = dirpath_ + "/ESP.info";\r
- T media;\r
- auto stream = std::ifstream(path, std::ifstream::in);\r
- media.ExtractMediaInfoFrom(stream);\r
- stream.close();\r
- return media;\r
- }\r
-\r
- TRACKTYPE GetTrackType() { return type_; }\r
-\r
- private:\r
- std::string dirpath_;\r
- std::ifstream stream_;\r
- TRACKTYPE type_;\r
-};\r
-\r
-} // namespace es\r
+//
+// @ Copyright [2018] <S/W Platform, Visual Display, Samsung Electronics>
+//
+
+#ifndef __PLUSPLAYER_UT_INCLUDE_ESCOMMON_H__
+#define __PLUSPLAYER_UT_INCLUDE_ESCOMMON_H__
+
+#include <chrono>
+#include <cstdlib>
+#include <fstream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+#include "plusplayer/espacket.h"
+#include "ut/include/appwindow.h"
+
+namespace pp = plusplayer;
+
+namespace utils {
+inline bool Exists(const std::string &path) {
+ std::ifstream ifile(path);
+ return static_cast<bool>(ifile);
+}
+} // namespace utils
+
+namespace {
+class Environment {
+ public:
+ Environment() {
+ appwindow_.reset(new plusplayer_ut::AppWindow(0, 0, 1920, 1080));
+ }
+ void *Window() { return appwindow_->GetWindow().obj; }
+ void *EcoreWindow() { return appwindow_->GetEcoreWL2Window(); }
+
+ private:
+ std::shared_ptr<plusplayer_ut::AppWindow> appwindow_;
+};
+
+class ESPacketDownloader {
+ public:
+ static void Init() {
+ // if (utils::Exists("/tmp/esdata")) {
+ // return;
+ // }
+ // std::cout << "Download ESData via http - path : /tmp/esdata" << std::endl;
+ // int ret = std::system(
+ // "wget "
+ // "--recursive --directory-prefix=/tmp/esdata --force-directories "
+ // "--no-host-directories --cut-dirs=2 --no-parent --reject=index.html "
+ // "http://10.88.105.104/WebAPITest/esdata/");
+ // assert(ret == 0 && "wget is failed, please retry");
+ }
+};
+} // namespace
+
+namespace es {
+inline std::uint64_t ConvertNsToMs(std::uint64_t ms) {
+ constexpr std::uint64_t ns_unit = 1000000;
+ return ms / ns_unit;
+}
+struct Packet {
+ std::uint64_t pts;
+ std::uint64_t duration;
+ std::uint64_t size;
+ std::shared_ptr<char> data;
+
+ pp::EsPacketPtr MakeEsPacket(pp::StreamType type) {
+ return std::move(
+ pp::EsPacket::Create(type, data, static_cast<std::uint32_t>(size),
+ // pts/1000000,duration/1000000));
+ ConvertNsToMs(pts), ConvertNsToMs(duration)));
+ }
+
+ static pp::EsPacketPtr MakeEosPacket(pp::StreamType type) {
+ return std::move(pp::EsPacket::CreateEos(type));
+ }
+};
+
+struct CodecExtraData {
+ std::uint32_t size;
+ std::shared_ptr<char> data;
+};
+using PacketPtr = std::shared_ptr<Packet>;
+using CodecExtraDataPtr = std::shared_ptr<CodecExtraData>;
+
+template <typename TRACK, typename TRACKTYPE>
+struct VideoInfo {
+ std::string mimetype;
+ int width, height;
+ int maxwidth, maxheight;
+ int framerate_num, framerate_den;
+
+ void ExtractMediaInfoFrom(std::ifstream &stream) {
+ stream >> mimetype >> width >> height >> maxwidth >> maxheight >>
+ framerate_num >> framerate_den;
+ }
+
+ TRACK GetTrack() {
+ TRACK t;
+ t.active = true;
+ t.index = 0;
+ t.type = TRACKTYPE::kTrackTypeVideo;
+ t.mimetype = mimetype;
+ t.width = width;
+ t.height = height;
+ t.maxwidth = maxwidth;
+ t.maxheight = maxheight;
+ t.framerate_num = framerate_num;
+ t.framerate_den = framerate_den;
+ return t;
+ }
+};
+
+template <typename TRACK, typename TRACKTYPE>
+struct AudioInfo {
+ std::string mimetype;
+ int samplerate;
+ int channels;
+ int version;
+
+ void ExtractMediaInfoFrom(std::ifstream &stream) {
+ stream >> mimetype >> samplerate >> channels >> version;
+ }
+ TRACK GetTrack() {
+ TRACK t;
+ t.active = true;
+ t.index = 0;
+ t.type = TRACKTYPE::kTrackTypeAudio;
+ t.mimetype = mimetype;
+ t.sample_rate = samplerate;
+ t.channels = channels;
+ t.version = version;
+ return t;
+ }
+};
+
+template <typename TRACKTYPE>
+class StreamReader {
+ public:
+ using Ptr = std::shared_ptr<StreamReader<TRACKTYPE>>;
+ friend Ptr;
+ static Ptr Create(const std::string &dirpath, const TRACKTYPE &type) {
+ return Ptr(new StreamReader(dirpath, type));
+ }
+ virtual ~StreamReader() {
+ if (stream_.is_open()) {
+ stream_.close();
+ }
+ }
+
+ private:
+ explicit StreamReader(const std::string dirpath, const TRACKTYPE &type)
+ : type_(type) {
+ dirpath_ = "/tmp/esdata/" + dirpath;
+ if (utils::Exists(dirpath_) == false) {
+ throw std::runtime_error(dirpath_ + "doesn't exist");
+ }
+ stream_ = std::ifstream(dirpath_ + "/ESP.es", std::ifstream::binary);
+ }
+
+ public:
+ CodecExtraDataPtr GetExtraData() {
+ std::string path = dirpath_ + "/ESP.codec_extradata";
+ auto stream = std::ifstream(path, std::ifstream::binary);
+ auto extradata = CodecExtraDataPtr(new CodecExtraData);
+ stream.read(reinterpret_cast<char *>(&extradata->size),
+ sizeof extradata->size);
+ using DataPtr = std::shared_ptr<char>;
+ extradata->data = DataPtr(new char[extradata->size]);
+ stream.read(reinterpret_cast<char *>(extradata->data.get()),
+ extradata->size);
+ stream.close();
+ return extradata;
+ }
+
+ PacketPtr ReadNextPacket() {
+ if (stream_.eof()) {
+ return nullptr;
+ }
+ auto pkt = PacketPtr(new Packet);
+ stream_.read(reinterpret_cast<char *>(&pkt->pts), sizeof pkt->pts);
+ stream_.read(reinterpret_cast<char *>(&pkt->duration),
+ sizeof pkt->duration);
+ stream_.read(reinterpret_cast<char *>(&pkt->size), sizeof pkt->size);
+ using DataPtr = std::unique_ptr<char>;
+ pkt->data = DataPtr(new char[pkt->size]);
+ stream_.read(reinterpret_cast<char *>(pkt->data.get()), pkt->size);
+ return pkt;
+ }
+
+ template <typename T>
+ T GetMediaInfo() {
+ std::string path = dirpath_ + "/ESP.info";
+ T media;
+ auto stream = std::ifstream(path, std::ifstream::in);
+ media.ExtractMediaInfoFrom(stream);
+ stream.close();
+ return media;
+ }
+
+ TRACKTYPE GetTrackType() { return type_; }
+
+ private:
+ std::string dirpath_;
+ std::ifstream stream_;
+ TRACKTYPE type_;
+};
+
+} // namespace es
#endif // __PLUSPLAYER_UT_INCLUDE_ESCOMMON_H__
\ No newline at end of file
#include <string>
#include <thread>
-#include "esplusplayer_capi/esplusplayer_capi.h"
#include "gmock/gmock.h"
#include "gst/gst.h"
#include "gtest/gtest.h"
+
+#include "esplusplayer_capi/esplusplayer_capi.h"
#include "ut/include/appwindow.h"
#include "ut/include/esplusplayer/eseventlistener.hpp"
#include "ut/include/esplusplayer/esreader.hpp"
ASSERT_EQ(esplusplayer_destroy(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
}
-TEST_F(EsTest, vdapi_basic_esplusplayer_set_tz_use_p_1) {
- esplusplayer_handle esplayer = esplusplayer_create();
- ASSERT_NE(nullptr, esplayer);
- ASSERT_EQ(esplusplayer_open(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
- ASSERT_EQ(esplusplayer_set_tz_use(esplayer, true),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- ASSERT_EQ(esplusplayer_close(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
- ASSERT_EQ(esplusplayer_destroy(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
TEST_F(EsTest, vdapi_basic_esplusplayer_set_video_frame_buffer_type_p_1) {
esplusplayer_handle esplayer = esplusplayer_create();
ASSERT_NE(nullptr, esplayer);
ASSERT_EQ(esplusplayer_destroy(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
}
+#ifdef PRODUCT_TEST
TEST_F(EsTest, vdapi_basic_esplusplayer_submit_encrypted_packet_p_1) {
esplusplayer_handle esplayer = NULL;
ASSERT_EQ(esplusplayer_submit_encrypted_packet(esplayer, NULL, NULL),
ESPLUSPLAYER_SUBMIT_STATUS_NOT_PREPARED);
}
-
-TEST_F(EsTest, vdapi_basic_esplusplayer_submit_trust_zone_packet_p_1) {
- esplusplayer_handle esplayer = NULL;
- ASSERT_EQ(esplusplayer_submit_trust_zone_packet(esplayer, NULL, 0),
- ESPLUSPLAYER_SUBMIT_STATUS_NOT_PREPARED);
-}
+#endif
TEST_F(EsTest, vdapi_basic_esplusplayer_submit_eos_packet_p_1) {
esplusplayer_handle esplayer = NULL;
ASSERT_EQ(esplusplayer_destroy(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
}
+#ifdef PRODUCT_TEST
TEST_F(EsTest, vdapi_basic_esplusplayer_set_low_latency_mode_p_1) {
esplusplayer_handle esplayer = esplusplayer_create();
ASSERT_NE(nullptr, esplayer);
ASSERT_EQ(esplusplayer_close(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
ASSERT_EQ(esplusplayer_destroy(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
}
+#endif
TEST_P(EsBasicTest, vdapi_basic_esplusplayer_set_audio_mute_p_1) {
ASSERT_EQ(esplusplayer_open(esplayer_), ESPLUSPLAYER_ERROR_TYPE_NONE);
std::this_thread::sleep_for(std::chrono::seconds(10));
}
+#ifdef PRODUCT_TEST
TEST_F(EsTest, vdapi_basic_esplusplayer_set_app_info_p_1) {
esplusplayer_handle esplayer = esplusplayer_create();
ASSERT_NE(nullptr, esplayer);
ASSERT_EQ(esplusplayer_close(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
ASSERT_EQ(esplusplayer_destroy(esplayer), ESPLUSPLAYER_ERROR_TYPE_NONE);
}
+#endif
TEST_P(EsBasicTest, vdapi_basic_esplusplayer_close_p_2) {
ASSERT_EQ(esplusplayer_open(esplayer_), ESPLUSPLAYER_ERROR_TYPE_NONE);
std::this_thread::sleep_for(std::chrono::seconds(3));
}
+#ifdef PRODUCT_TEST
TEST_P(EsBasicTest, vdapi_basic_esplusplayer_render_video_frame_p_1) {
ASSERT_EQ(esplusplayer_open(esplayer_), ESPLUSPLAYER_ERROR_TYPE_NONE);
ASSERT_EQ(esplusplayer_stop_audio_easing(esplayer_),
ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION);
}
+#endif
INSTANTIATE_TEST_CASE_P(ESPlusplayer, EsBasicTest,
::testing::ValuesIn(es_tc::tc_list));
+++ /dev/null
-#include "mixer/constant.h"
-
-namespace plusplayer_ut {
-
-VideoPlaneManipulableInfo GetVideoPlaneManipulableInfo(
- BufferHandleType handle, const PlaneComponent& comp,
- const std::uint32_t& linesize, const Geometry& geom) {
- VideoPlaneManipulableInfo ret;
- ret.handle = handle;
- ret.component = comp;
- ret.linesize = linesize;
- ret.rect = geom;
- return ret;
-}
-
-Geometry GetGeometry(const int& x, const int& y, const int& w, const int& h) {
- Geometry geom;
- geom.x = x;
- geom.y = y;
- geom.w = w;
- geom.h = h;
- return geom;
-}
-
-CropArea GetCropArea(const double& x, const double& y, const double& w,
- const double& h) {
- CropArea croparea;
- croparea.scale_x = x;
- croparea.scale_y = y;
- croparea.scale_w = w;
- croparea.scale_h = h;
- return croparea;
-}
-
-Mixer::ResolutionInfo GetResolutionInfo(int width, int height, int fnum,
- int fden) {
- Mixer::ResolutionInfo rinfo;
- rinfo.width = width;
- rinfo.height = height;
- rinfo.framerate_num = fnum;
- rinfo.framerate_den = fden;
- return rinfo;
-}
-
-static std::uint32_t _kDefaultBuffer = 0;
-BufferDefaultType kDefaultBuffer =
- reinterpret_cast<BufferDefaultType>(&_kDefaultBuffer);
-
-BufferUnionHandleType kDefaultMappedHandle = {.u32 = kDefaultBufferHandle};
-
-} // namespace plusplayer_ut
\ No newline at end of file
+++ /dev/null
-#include "mixer/matcher.h"
-
-namespace plusplayer_ut {
-
-Matcher<const VideoPlaneManipulableInfo&> IsSameVideoPlaneManipulableInfo(
- const VideoPlaneManipulableInfo& comparer) {
- return MakeMatcher(new IsSameVideoPlaneManipulableInfoMatcher(comparer));
-}
-
-} // namespace plusplayer_ut
\ No newline at end of file
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-#include <gtest/gtest.h>
-
-#include <iostream>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer_capi/mixer_capi.h"
-#include "ut/include/plusplayer/utility.h"
-#include "ut/include/streamreader.hpp"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-using namespace utils;
-using namespace std;
-
-using utils::Utility;
-std::string es_uri_1 = "youtube/";
-std::string es_uri_2 = "bunny/";
-std::string es_vp8_uri = "es_vp8_vorbis/";
-
-//max playing duration : 10 sec => see EsStreamReader::ReadNextPacket()
-constexpr int kPlayingTime = 2; // (sec)
-
-//------------------------------------------------------------
-class MixerEsppScenarioTestF : public ::testing::Test {
- public:
- explicit MixerEsppScenarioTestF(void)
- : util_(Utility::Instance()),
- mixer_(nullptr),
- player1_(nullptr),
- player2_(nullptr),
- player3_(nullptr),
- player4_(nullptr){};
- ~MixerEsppScenarioTestF(void){};
-
- static void SetUpTestCase() {
- ESPacketDownloader::Init();
- std::cout << "SetUpTestCase()" << std::endl;
- }
-
- static void TearDownTestCase() {}
-
- virtual void SetUp(void) override {
- LOG_ERROR("%s", util_.GetCurrentTestName());
- mixer_ = mixer_create();
- mixer_set_display(mixer_, MIXER_DISPLAY_TYPE_OVERLAY, util_.GetWindow());
-#if 1
- roi1_.x = 20;
- roi1_.y = 20;
- roi1_.w = 720;
- roi1_.h = 480;
-
- roi2_.x = 1000;
- roi2_.y = 20;
- roi2_.w = 720;
- roi2_.h = 480;
-
- roi3_.x = 1000;
- roi3_.y = 520;
- roi3_.w = 720;
- roi3_.h = 480;
-
- roi4_.x = 20;
- roi4_.y = 520;
- roi4_.w = 720;
- roi4_.h = 480;
-#else
- roi1_.x = 20;
- roi1_.y = 20;
- roi1_.w = 1180;
- roi1_.h = 720;
-
- roi2_.x = 1220;
- roi2_.y = 20;
- roi2_.w = 640;
- roi2_.h = 480;
-
- roi3_.x = 1220;
- roi3_.y = 520;
- roi3_.w = 640;
- roi3_.h = 480;
-#endif
- }
-
- virtual void TearDown(void) override {
- util_.DestroyESPP(player1_);
- util_.DestroyESPP(player2_);
- util_.DestroyESPP(player3_);
- util_.DestroyESPP(player4_);
- mixer_destroy(mixer_);
- player1_ = nullptr;
- player2_ = nullptr;
- player3_ = nullptr;
- player4_ = nullptr;
- mixer_ = nullptr;
- LOG_ERROR("%s", util_.GetCurrentTestName());
- }
-
- public:
- Utility& util_;
- mixer_handle mixer_;
- esplusplayer_handle player1_;
- esplusplayer_handle player2_;
- esplusplayer_handle player3_;
- esplusplayer_handle player4_;
- Geometry roi1_;
- Geometry roi2_;
- Geometry roi3_;
- Geometry roi4_;
-};
-
-#if 1 // normal mixer test
-TEST_F(MixerEsppScenarioTestF, Basic) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
- player3_ = util_.GetOpenedMixESPP(mixer_, roi3_);
- ASSERT_NE(player3_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player1_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player3_, es_uri_1));
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, DetachAttach) {
- player1_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetStartedMixESPP(es_uri_2, mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- player3_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi3_);
- ASSERT_NE(player3_, nullptr);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, DetachAttach1) {
- player1_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- player3_ = util_.GetStartedMixESPP(es_uri_2, mixer_, roi1_);
- ASSERT_NE(player3_, nullptr);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, SetROI) {
- player1_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetStartedMixESPP(es_uri_2, mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_set_display_roi(player1_, roi2_.x, roi2_.y, roi2_.w,
- roi2_.h),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_display_roi(player2_, roi1_.x, roi1_.y, roi1_.w,
- roi1_.h),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_commit(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, SetROI1) {
- player1_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetStartedMixESPP(es_uri_2, mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_set_display_roi(player1_, roi2_.x, roi2_.y, roi2_.w,
- roi2_.h),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_display_roi(player2_, roi3_.x, roi3_.y, roi3_.w,
- roi3_.h),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_commit(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, CheckMaxMixedPlayer) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
- player3_ = util_.GetOpenedMixESPP(mixer_, roi3_);
- ASSERT_NE(player3_, nullptr);
- esplusplayer_handle player4 = util_.GetOpenedMixESPP(mixer_, roi3_);
- ASSERT_NE(player4, nullptr);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player3_, es_uri_1));
-
- EXPECT_FALSE(util_.PrepareESPP(player4, es_uri_1));
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- util_.DestroyESPP(player4);
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, SetAudioFocus) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player1_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_2));
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player2_), MIXER_ERROR_TYPE_NONE);
- util_.FeedingEsPacket(player2_, ESPLUSPLAYER_STREAM_TYPE_AUDIO, es_uri_2);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, MultiAudioTest) {
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer_), MIXER_ERROR_TYPE_NONE);
-
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- player3_ = util_.GetOpenedMixESPP(mixer_, roi3_);
- ASSERT_NE(player3_, nullptr);
-
- EXPECT_EQ(esplusplayer_set_audio_codec_type(player2_,
- ESPLUSPLAYER_AUDIO_CODEC_TYPE_SW),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_audio_codec_type(player3_,
- ESPLUSPLAYER_AUDIO_CODEC_TYPE_SW),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_2));
- EXPECT_TRUE(util_.PrepareESPP(player3_, es_uri_1));
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, MultiAudioTest2) {
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer_), MIXER_ERROR_TYPE_NONE);
-
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- player3_ = util_.GetOpenedMixESPP(mixer_, roi3_);
- ASSERT_NE(player3_, nullptr);
-
- EXPECT_EQ(esplusplayer_set_alternative_video_resource(player2_, 1),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_video_codec_type(player3_,
- ESPLUSPLAYER_VIDEO_CODEC_TYPE_SW),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_audio_codec_type(player2_,
- ESPLUSPLAYER_AUDIO_CODEC_TYPE_SW),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_audio_codec_type(player3_,
- ESPLUSPLAYER_AUDIO_CODEC_TYPE_SW),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_2));
- EXPECT_TRUE(util_.PrepareESPP(player3_, es_uri_1));
-
- /* audio hw decoder + mmaudiosink */
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- /* audio sw decoder + pulsesink */
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- /* audio sw decoder + pulsesink */
- EXPECT_EQ(esplusplayer_start(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_deactivate(player1_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_deactivate(player3_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- /* audio hw decoder + mmaudiosink */
- EXPECT_EQ(esplusplayer_set_audio_codec_type(player3_,
- ESPLUSPLAYER_AUDIO_CODEC_TYPE_HW),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_activate(player3_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- util_.FeedingEsPacket(player3_, ESPLUSPLAYER_STREAM_TYPE_AUDIO, es_uri_1);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_deactivate(player2_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_deactivate(player3_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- /* audio sw decoder + alsasink */
- EXPECT_EQ(esplusplayer_activate(player2_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- util_.FeedingEsPacket(player2_, ESPLUSPLAYER_STREAM_TYPE_AUDIO, es_uri_2);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, SetAudioFocus1) {
- player1_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetStartedMixESPP(es_uri_2, mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, SetAudioFocus2) {
- player1_ = util_.GetStartedMixESPP(es_uri_1, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, nullptr),
- MIXER_ERROR_TYPE_INVALID_OPERATION);
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, MixerNPlayer) {
- mixer_set_display_mode(mixer_, MIXER_DISPLAY_MODE_DST_ROI);
- mixer_set_display_roi(mixer_, roi2_.x, roi2_.y, roi2_.w, roi2_.h);
- mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DISABLE);
- mixer_disable_audio_focus_setting(mixer_);
- mixer_set_alternative_video_scaler(mixer_);
-
- player1_ = util_.GetOpenedESPP(roi1_);
- ASSERT_NE(player1_, nullptr);
-
- Geometry roi3;
- roi3.x = 0;
- roi3.y = 0;
- roi3.w = roi2_.w;
- roi3.h = roi2_.h;
- player2_ = util_.GetOpenedMixESPP(mixer_, roi3);
- ASSERT_NE(player2_, nullptr);
- esplusplayer_set_alternative_video_resource(player2_, 1);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1, utils::EsType::kBoth));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_2, utils::EsType::kVideo));
-
- esplusplayer_start(player1_);
- esplusplayer_start(player2_);
-
- mixer_start(mixer_);
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_EQ(esplusplayer_deactivate(player1_, ESPLUSPLAYER_STREAM_TYPE_VIDEO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_deactivate(player2_, ESPLUSPLAYER_STREAM_TYPE_VIDEO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(esplusplayer_set_display(player1_, ESPLUSPLAYER_DISPLAY_TYPE_MIXER,
- mixer_),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_display(
- player2_, ESPLUSPLAYER_DISPLAY_TYPE_OVERLAY, util_.GetWindow()),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- esplusplayer_set_alternative_video_resource(player1_, 1);
- EXPECT_EQ(esplusplayer_activate(player1_, ESPLUSPLAYER_STREAM_TYPE_VIDEO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- esplusplayer_set_display_roi(player1_, roi3.x, roi3.y, roi3.w, roi3.h);
- mixer_commit(mixer_);
- util_.FeedingEsPacket(player1_, ESPLUSPLAYER_STREAM_TYPE_VIDEO, es_uri_1);
-
- esplusplayer_set_alternative_video_resource(player2_, 0);
- EXPECT_EQ(esplusplayer_activate(player2_, ESPLUSPLAYER_STREAM_TYPE_VIDEO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- esplusplayer_set_display_mode(player2_, ESPLUSPLAYER_DISPLAY_MODE_DST_ROI);
- esplusplayer_set_display_roi(player2_, roi1_.x, roi1_.y, roi1_.w, roi1_.h);
- util_.FeedingEsPacket(player2_, ESPLUSPLAYER_STREAM_TYPE_VIDEO, es_uri_2);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- esplusplayer_stop(player1_);
- esplusplayer_stop(player2_);
- mixer_stop(mixer_);
-}
-
-TEST_F(MixerEsppScenarioTestF, NDecH264PlayerX2) {
- mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_NDECODER);
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player1_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_1));
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(10));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, NDecH264PlayerX4) {
- mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_NDECODER);
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
- player3_ = util_.GetOpenedMixESPP(mixer_, roi3_);
- ASSERT_NE(player3_, nullptr);
- player4_ = util_.GetOpenedMixESPP(mixer_, roi4_);
- ASSERT_NE(player4_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player1_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player3_, es_uri_1));
- EXPECT_TRUE(util_.PrepareESPP(player4_, es_uri_1));
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player4_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(10));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player4_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, NDecVp8PlayerX2) {
- mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_NDECODER);
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player1_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_vp8_uri));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_vp8_uri));
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(10));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(MixerEsppScenarioTestF, NDecVp8PlayerX4) {
- mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_NDECODER);
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixESPP(mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
- player3_ = util_.GetOpenedMixESPP(mixer_, roi3_);
- ASSERT_NE(player3_, nullptr);
- player4_ = util_.GetOpenedMixESPP(mixer_, roi4_);
- ASSERT_NE(player4_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player1_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_TRUE(util_.PrepareESPP(player1_, es_vp8_uri));
- EXPECT_TRUE(util_.PrepareESPP(player2_, es_vp8_uri));
- EXPECT_TRUE(util_.PrepareESPP(player3_, es_vp8_uri));
- EXPECT_TRUE(util_.PrepareESPP(player4_, es_vp8_uri));
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player4_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(10));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player3_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player4_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-#endif
+++ /dev/null
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include <iostream>
-#include <memory>
-
-#include "mixer/constant.h"
-#include "mixer/matcher.h"
-#include "mixer/mixedframe.h"
-#include "mixer/mock/fakebuffer.h"
-#include "mixer/mock/mock_bufferobject.h"
-#include "mixer/mock/mock_memallocator.h"
-#include "mixer/mock/mock_phyaddraccessor.h"
-#include "mixer/mock/mock_vpmanipulator.h"
-#include "mixer/mock/movable.h"
-#include "mixer/mock/moveobj_wrapper.h"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::AtLeast;
-using ::testing::ByRef;
-using ::testing::DoAll;
-using ::testing::ElementsAre;
-using ::testing::Field;
-using ::testing::Invoke;
-using ::testing::NotNull;
-using ::testing::Return;
-using ::testing::SaveArg;
-using ::testing::SizeIs;
-
-/********************************************************************************************
- * [DEFAULT CLASS] DefaultMixedFrameTestOption
- */
-
-class DefaultMixedFrameTestOption {
- public:
- explicit DefaultMixedFrameTestOption() = default;
- virtual ~DefaultMixedFrameTestOption() = default;
-
- protected:
- virtual void Init_() {
- ON_CALL(GetMemoryAllocator_(), Allocate(_))
- .WillByDefault(DoAll(
- SaveArg<0>(&allocated_size_), CreateFakeBuffer(fakebuffer_),
- Invoke(
- this,
- &DefaultMixedFrameTestOption::DelegateDefaultForBufferObject_),
- Return(RelaseBufferObject_())));
- }
-
- protected:
- MockMemoryAllocator& GetMemoryAllocator_() { return memalloc_; }
- MockAccessibleBufferObject& GetBufferObject_() { return bufferobj_.Get(); }
- MockAccessibleBufferObject* RelaseBufferObject_() {
- return bufferobj_.Move();
- }
- MockPhyAddrAccessor& GetReadablePhyAddrAccessor_() {
- return r_phyaddraccessor_.Get();
- }
- MockPhyAddrAccessor& GetWritablePhyAddrAccessor_() {
- return w_phyaddraccessor_.Get();
- }
- MockAccessibleBufferObject::PhyAddrAccessorPtr
- MoveReadablePhyAddrAccessor_() {
- return MockAccessibleBufferObject::PhyAddrAccessorPtr(
- r_phyaddraccessor_.Move());
- }
- MockAccessibleBufferObject::PhyAddrAccessorPtr
- MoveWritablePhyAddrAccessor_() {
- return MockAccessibleBufferObject::PhyAddrAccessorPtr(
- w_phyaddraccessor_.Move());
- }
-
- private:
- virtual void DelegateDefaultForBufferObject_(const std::uint32_t size) {
- ON_CALL(GetBufferObject_(), GetReadableAddress_())
- .WillByDefault(
- Return(Movable(MockAccessibleBufferObject::PhyAddrAccessorPtr(
- MoveReadablePhyAddrAccessor_()))));
- ON_CALL(GetBufferObject_(), GetWritableAddress_())
- .WillByDefault(
- Return(Movable(MockAccessibleBufferObject::PhyAddrAccessorPtr(
- MoveWritablePhyAddrAccessor_()))));
- ON_CALL(GetBufferObject_(), GetBufferHandle())
- .WillByDefault(Return(kDefaultBufferHandle));
- ON_CALL(GetBufferObject_(), Export())
- .WillByDefault(Return(kDefaultBufferKey));
- ON_CALL(GetBufferObject_(), GetSize())
- .WillByDefault(Return(allocated_size_));
-
- ON_CALL(GetReadablePhyAddrAccessor_(), GetAddress())
- .WillByDefault(Return(fakebuffer_->ptr.get()));
- ON_CALL(GetWritablePhyAddrAccessor_(), GetAddress())
- .WillByDefault(Return(fakebuffer_->ptr.get()));
- }
-
- private:
- std::uint32_t allocated_size_;
- FakeBufferPtr fakebuffer_;
-
- MoveObjectWrapper<MockPhyAddrAccessor> r_phyaddraccessor_{
- new MockPhyAddrAccessor()};
- MoveObjectWrapper<MockPhyAddrAccessor> w_phyaddraccessor_{
- new MockPhyAddrAccessor()};
- MoveObjectWrapper<MockAccessibleBufferObject> bufferobj_{
- new MockAccessibleBufferObject()};
- MockMemoryAllocator memalloc_;
-};
-
-/********************************************************************************************
- * InvalidMixedFrameTest
- */
-
-class InvalidMixedFrameTest : public ::testing::Test {
- public:
- virtual void SetUp() override {
- mixed_frame_ = MixedFrame::Create(nullptr, kInvalidWidth, kInvalidHeight);
- ASSERT_FALSE(mixed_frame_->IsValid());
- }
- virtual void TearDown() override {}
-
- protected:
- MixedFramePtr& GetMixedFrame() { return mixed_frame_; }
- const MockVideoPlaneManipulator& GetVideoPlaneManipulator_() const {
- return vieoplane_manip_;
- }
-
- private:
- MixedFramePtr mixed_frame_;
- MockVideoPlaneManipulator vieoplane_manip_;
-};
-
-TEST_F(InvalidMixedFrameTest, GetVideoPlaneManipInfo) {
- EXPECT_EQ(0, GetMixedFrame()->GetVideoPlaneManipInfo().size());
-}
-
-TEST_F(InvalidMixedFrameTest, GetSize) {
- EXPECT_EQ(0, GetMixedFrame()->GetSize());
-}
-
-TEST_F(InvalidMixedFrameTest, Render) {
- EXPECT_FALSE(GetMixedFrame()->Render(
- &GetVideoPlaneManipulator_(),
- {kYComponentSrcVMInfo, kUVComponentSrcVMInfo},
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-TEST_F(InvalidMixedFrameTest, Export) {
- BufferKeyType key;
- EXPECT_FALSE(GetMixedFrame()->Export(key));
-}
-
-/********************************************************************************************
- * MixedFrameConstructionTest
- */
-class MixedFrameConstructionTest : public ::testing::Test,
- public DefaultMixedFrameTestOption {
- public:
- using MockBufferObjectPtr = std::unique_ptr<MockBufferObject>;
- virtual ~MixedFrameConstructionTest() {}
-
- virtual void SetUp() override { Init_(); }
- virtual void TearDown() override {}
-};
-
-TEST_F(MixedFrameConstructionTest, IsValid_WithInvalidAllocator) {
- EXPECT_FALSE(
- MixedFrame::Create(nullptr, kDefaultWidth, kDefaultHeight)->IsValid());
-}
-
-TEST_F(MixedFrameConstructionTest, IsValid_WithInvalidResolution) {
- EXPECT_FALSE(
- MixedFrame::Create(&GetMemoryAllocator_(), kInvalidWidth, kInvalidHeight)
- ->IsValid());
-}
-
-TEST_F(MixedFrameConstructionTest, IsValid_WithAllocateNullPtr) {
- EXPECT_CALL(GetMemoryAllocator_(), Allocate(kExpectedDefaultByteSize))
- .WillOnce(Return(nullptr));
-
- EXPECT_FALSE(
- MixedFrame::Create(&GetMemoryAllocator_(), kDefaultWidth, kDefaultHeight)
- ->IsValid());
-}
-
-TEST_F(MixedFrameConstructionTest, IsValid_WithZeroSizeAllocated) {
- EXPECT_CALL(GetMemoryAllocator_(), Allocate(kExpectedDefaultByteSize))
- .Times(1);
- EXPECT_CALL(GetBufferObject_(), GetSize()).WillOnce(Return(0));
-
- EXPECT_FALSE(
- MixedFrame::Create(&GetMemoryAllocator_(), kDefaultWidth, kDefaultHeight)
- ->IsValid());
-}
-
-TEST_F(MixedFrameConstructionTest, IsValid_WithReturnWritableNullPtr) {
- EXPECT_CALL(GetMemoryAllocator_(), Allocate(kExpectedDefaultByteSize))
- .Times(1);
- EXPECT_CALL(GetBufferObject_(), GetSize()).Times(1);
- EXPECT_CALL(GetBufferObject_(), GetWritableAddress_())
- .WillOnce(Return(Movable(AccessibleBuffer::PhyAddrAccessorPtr(nullptr))));
-
- EXPECT_TRUE(
- MixedFrame::Create(&GetMemoryAllocator_(), kDefaultWidth, kDefaultHeight)
- ->IsValid());
-}
-
-TEST_F(MixedFrameConstructionTest, IsValid) {
- EXPECT_CALL(GetMemoryAllocator_(), Allocate(kExpectedDefaultByteSize))
- .Times(1);
- EXPECT_CALL(GetBufferObject_(), GetSize()).Times(1);
- EXPECT_CALL(GetBufferObject_(), GetWritableAddress_()).Times(1);
- EXPECT_CALL(GetWritablePhyAddrAccessor_(), GetAddress()).Times(2);
-
- EXPECT_TRUE(
- MixedFrame::Create(&GetMemoryAllocator_(), kDefaultWidth, kDefaultHeight)
- ->IsValid());
-}
-
-/********************************************************************************************
- * MixedFrameTest
- */
-
-class MixedFrameTest : public ::testing::Test,
- public DefaultMixedFrameTestOption {
- public:
- explicit MixedFrameTest() = default;
- virtual ~MixedFrameTest() = default;
-
- virtual void SetUp() override {
- Init_();
-
- ON_CALL(GetVideoPlaneManipulator_(), Do(_, _)).WillByDefault(Return(true));
-
- EXPECT_CALL(GetMemoryAllocator_(), Allocate(_)).Times(1);
-
- EXPECT_CALL(GetBufferObject_(), GetSize()).Times(AtLeast(1));
- EXPECT_CALL(GetBufferObject_(), GetWritableAddress_()).Times(AtLeast(1));
-
- EXPECT_CALL(GetWritablePhyAddrAccessor_(), GetAddress()).Times(2);
-
- mixed_frame_ = MixedFrame::Create(&GetMemoryAllocator_(), kDefaultWidth,
- kDefaultHeight);
- ASSERT_TRUE(mixed_frame_->IsValid());
- }
- virtual void TearDown() override {}
-
- protected:
- MockVideoPlaneManipulator& GetVideoPlaneManipulator_() {
- return vieoplane_manip_;
- }
- MixedFramePtr& GetMixedFrame() { return mixed_frame_; }
-
- private:
- MixedFramePtr mixed_frame_;
- MockVideoPlaneManipulator vieoplane_manip_;
-};
-
-TEST_F(MixedFrameTest, GetVideoPlaneManipInfo) {
- EXPECT_CALL(GetBufferObject_(), GetBufferHandle());
- EXPECT_THAT(
- GetMixedFrame()->GetVideoPlaneManipInfo(),
- AllOf(SizeIs(2),
- ElementsAre(
- IsSameVideoPlaneManipulableInfo(kYComponentDestVMInfo),
- IsSameVideoPlaneManipulableInfo(kUVComponentDestVMInfo))));
-}
-
-TEST_F(MixedFrameTest, GetWidth) {
- EXPECT_EQ(kDefaultWidth, GetMixedFrame()->GetWidth());
-}
-
-TEST_F(MixedFrameTest, GetHeight) {
- EXPECT_EQ(kDefaultHeight, GetMixedFrame()->GetHeight());
-}
-
-TEST_F(MixedFrameTest, GetSize) {
- EXPECT_EQ(kExpectedDefaultByteSize, GetMixedFrame()->GetSize());
-}
-
-TEST_F(MixedFrameTest, Render) {
- ::testing::Sequence s1;
- EXPECT_CALL(GetBufferObject_(), GetBufferHandle()).Times(2);
-
- EXPECT_CALL(GetVideoPlaneManipulator_(),
- Do(IsSameVideoPlaneManipulableInfo(kYComponentSrcVMInfo),
- IsSameVideoPlaneManipulableInfo(kCroppedYComponentDestVMInfo)))
- .InSequence(s1);
- EXPECT_CALL(
- GetVideoPlaneManipulator_(),
- Do(IsSameVideoPlaneManipulableInfo(kUVComponentSrcVMInfo),
- IsSameVideoPlaneManipulableInfo(kCroppedUVComponentDestVMInfo)))
- .InSequence(s1);
-
- EXPECT_TRUE(GetMixedFrame()->Render(
- &GetVideoPlaneManipulator_(),
- {kYComponentSrcVMInfo, kUVComponentSrcVMInfo},
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-TEST_F(MixedFrameTest, Render_WithNullOperator) {
- EXPECT_FALSE(GetMixedFrame()->Render(
- nullptr, {kYComponentSrcVMInfo, kUVComponentSrcVMInfo},
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-TEST_F(MixedFrameTest, Render_WithFirstOpFailed) {
- EXPECT_CALL(GetBufferObject_(), GetBufferHandle()).Times(2);
-
- EXPECT_CALL(GetVideoPlaneManipulator_(),
- Do(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kYComponent),
- _))
- .WillOnce(Return(false));
- EXPECT_CALL(GetVideoPlaneManipulator_(),
- Do(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kUVComponent),
- _))
- .Times(1);
-
- EXPECT_FALSE(GetMixedFrame()->Render(
- &GetVideoPlaneManipulator_(),
- {kYComponentSrcVMInfo, kUVComponentSrcVMInfo},
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-TEST_F(MixedFrameTest, Render_WithSecondOpFailed) {
- EXPECT_CALL(GetBufferObject_(), GetBufferHandle()).Times(2);
-
- EXPECT_CALL(GetVideoPlaneManipulator_(),
- Do(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kYComponent),
- _))
- .Times(1);
- EXPECT_CALL(GetVideoPlaneManipulator_(),
- Do(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kUVComponent),
- _))
- .WillOnce(Return(false));
-
- EXPECT_FALSE(GetMixedFrame()->Render(
- &GetVideoPlaneManipulator_(),
- {kYComponentSrcVMInfo, kUVComponentSrcVMInfo},
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-TEST_F(MixedFrameTest, Export) {
- EXPECT_CALL(GetBufferObject_(), Export());
- BufferKeyType key;
- EXPECT_TRUE(GetMixedFrame()->Export(key));
- EXPECT_EQ(kDefaultBufferKey, key);
-}
\ No newline at end of file
+++ /dev/null
-
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-#include <gtest/gtest.h>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/mixer.h"
-#include "mixer/mixer_eventlistener.h"
-#include "mixer/mixerticket.h"
-#include "mixer/mixerticket_eventlistener.h"
-#include "ut/include/appwindow.h"
-#include "ut/include/plusplayer/utility.h"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-using namespace utils;
-
-class MixerMockPlayer {
- public:
- MixerMockPlayer() { listener_ = new MyTicketListener(this); }
- MixerMockPlayer(int x, int y, int w, int h) {
- listener_ = new MyTicketListener(this);
- display_info_.geometry.x = x;
- display_info_.geometry.y = y;
- display_info_.geometry.w = w;
- display_info_.geometry.h = h;
- }
- ~MixerMockPlayer() { delete listener_; }
-
- class MyTicketListener : public MixerTicketEventListener {
- public:
- explicit MyTicketListener(MixerMockPlayer* handler) : handler_(handler){};
- bool OnAudioFocusChanged(bool active) {
- LOG_INFO("My OnAudioFocusChanged [%d] player [%p]", active, handler_);
- return true;
- }
-
- bool OnUpdateDisplayInfo(const DisplayInfo& cur_info,
- DisplayInfo* new_info) {
- *new_info = handler_->display_info_;
- LOG_INFO("OnUpdateDisplayInfo x[%d] y[%d]",
- handler_->display_info_.geometry.x,
- handler_->display_info_.geometry.y);
- return true;
- }
- MixerMockPlayer* handler_ = nullptr;
- };
-
- public:
- MixerTicketEventListener* listener_ = nullptr;
- DisplayInfo display_info_;
-};
-
-class MixerMockListener : public MixerEventListener {
- public:
- MixerMockListener() {}
- ~MixerMockListener() {}
- void OnError() {
- LOG_INFO(" listener [%p]", this);
- }
- void OnResourceConflicted() {
- LOG_INFO("MyOnResourceConflicted listener[%p]", this);
- }
-};
-
-TEST(MixerTest, MixerCreate) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- ASSERT_NE(mixer, nullptr);
- mixer.reset();
-}
-
-TEST(MixerTest, MixerTicketCreate) {
- MixerMockPlayer p1;
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ASSERT_NE(ticket, nullptr);
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerTest, MixerDisableAutoRscAlloc_1) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- EXPECT_TRUE(mixer->SetRscAllocMode(RscAllocMode::kDisable));
- mixer.reset();
-}
-
-TEST(MixerTest, MixerDisableAutoRscAlloc_2) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockPlayer p1;
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_FALSE(mixer->SetRscAllocMode(RscAllocMode::kDisable));
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerTest, MixerDisableAudioFocusSetting_1) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- EXPECT_TRUE(mixer->DisableAudioFocusSetting());
- mixer.reset();
-}
-
-TEST(MixerTest, MixerDisableAudioFocusSetting_2) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockPlayer p1;
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_FALSE(mixer->DisableAudioFocusSetting());
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerTest, MixerSetAudioFocus_1) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockPlayer p1;
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_TRUE(mixer->SetAudioFocus(&p1));
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerTest, MixerSetAudioFocus_2) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockPlayer p1, p2;
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- MixerTicket* ticket2 = mixer->CreateTicket(&p2);
-
- ticket->RegisterListener(p1.listener_);
- ticket2->RegisterListener(p2.listener_);
-
- EXPECT_TRUE(mixer->SetAudioFocus(&p2));
-
- delete ticket;
- delete ticket2;
-
- mixer.reset();
-}
-
-TEST(MixerTest, MixerSetAudioFocus_3) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- mixer->DisableAudioFocusSetting();
- MixerMockPlayer p1;
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_FALSE(mixer->SetAudioFocus(&p1));
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerTest, MixerSetDisplay) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- EXPECT_TRUE(mixer->SetDisplay(DisplayType::kOverlay,
- Utility::Instance().GetWindow()));
- mixer.reset();
-}
-
-TEST(MixerTest, MixerCommit) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockPlayer p1(1, 1, 1, 1);
- MixerMockPlayer p2(2, 2, 2, 2);
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- MixerTicket* ticket2 = mixer->CreateTicket(&p2);
-
- ticket->RegisterListener(p1.listener_);
- ticket2->RegisterListener(p2.listener_);
-
- EXPECT_TRUE(mixer->Commit());
-
- delete ticket;
- delete ticket2;
-
- mixer.reset();
-}
-
-TEST(MixerTest, MixerSetDisplayRoi) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockPlayer p1;
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
-
- ticket->RegisterListener(p1.listener_);
- Geometry geometry;
- geometry.x = 11;
- geometry.y = 11;
- geometry.w = 22;
- geometry.h = 22;
- EXPECT_TRUE(mixer->SetDisplayRoi(geometry));
-
- delete ticket;
-
- mixer.reset();
-}
-
-TEST(MixerTest, MixerSetDisplayMode) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockPlayer p1;
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
-
- ticket->RegisterListener(p1.listener_);
- EXPECT_TRUE(mixer->SetDisplayMode(DisplayMode::kDstRoi));
-
- delete ticket;
-
- mixer.reset();
-}
-
-TEST(MixerTest, MixerRegisterListener) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerMockListener* listener = new MixerMockListener;
- EXPECT_TRUE(mixer->RegisterListener(listener));
- mixer.reset();
- delete listener;
-}
-
-TEST(MixerTest, MixerStart) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- EXPECT_TRUE(mixer->SetDisplay(DisplayType::kOverlay,
- Utility::Instance().GetWindow()));
- Geometry geometry;
- geometry.x = 0;
- geometry.y = 0;
- geometry.w = 1920;
- geometry.h = 1080;
- EXPECT_TRUE(mixer->SetDisplayRoi(geometry));
- MixerMockListener* listener = new MixerMockListener;
- EXPECT_TRUE(mixer->RegisterListener(listener));
- EXPECT_TRUE(mixer->Start());
- std::this_thread::sleep_for(std::chrono::seconds(3));
- EXPECT_TRUE(mixer->Stop());
- mixer.reset();
- delete listener;
-}
-
-TEST(MixerTest, MixerSetAlternativeVideoScaler) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- EXPECT_TRUE(mixer->SetAlternativeVideoScaler());
- EXPECT_TRUE(mixer->SetDisplay(DisplayType::kOverlay,
- Utility::Instance().GetWindow()));
- Geometry geometry;
- geometry.x = 0;
- geometry.y = 0;
- geometry.w = 1920;
- geometry.h = 1080;
- EXPECT_TRUE(mixer->SetDisplayRoi(geometry));
- MixerMockListener* listener = new MixerMockListener;
- EXPECT_TRUE(mixer->RegisterListener(listener));
- EXPECT_TRUE(mixer->Start());
- std::this_thread::sleep_for(std::chrono::seconds(3));
- EXPECT_TRUE(mixer->Stop());
- mixer.reset();
- delete listener;
-}
\ No newline at end of file
+++ /dev/null
-
-
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-#include <gtest/gtest.h>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer_capi/mixer_capi.h"
-#include "ut/include/appwindow.h"
-#include "ut/include/plusplayer/utility.h"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-using namespace utils;
-
-class CMixerMockPlayer {
- public:
- CMixerMockPlayer() { listener_ = new MyTicketListener(this); }
- CMixerMockPlayer(int x, int y, int w, int h) {
- listener_ = new MyTicketListener(this);
- display_info_.geometry.x = x;
- display_info_.geometry.y = y;
- display_info_.geometry.w = w;
- display_info_.geometry.h = h;
- }
- ~CMixerMockPlayer() { delete listener_; }
-
- class MyTicketListener : public MixerTicketEventListener {
- public:
- explicit MyTicketListener(CMixerMockPlayer* handler) : handler_(handler){};
- bool OnAudioFocusChanged(bool active) {
- LOG_INFO("My OnAudioFocusChanged [%d] player [%p]", active, handler_);
- return true;
- }
-
- bool OnUpdateDisplayInfo(const DisplayInfo& cur_info,
- DisplayInfo* new_info) {
- *new_info = handler_->display_info_;
- LOG_INFO("OnUpdateDisplayInfo x[%d] y[%d]",
- handler_->display_info_.geometry.x,
- handler_->display_info_.geometry.y);
- return true;
- }
- CMixerMockPlayer* handler_ = nullptr;
- };
-
- public:
- MixerTicketEventListener* listener_ = nullptr;
- DisplayInfo display_info_;
-};
-
-TEST(CMixerTest, vdapi_mixer_create_p_1) {
- mixer_handle mixer = mixer_create();
- ASSERT_NE(mixer, nullptr);
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_create_ticket_p_1) {
- CMixerMockPlayer p1;
- mixer_handle mixer = mixer_create();
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
- ASSERT_NE(ticket, nullptr);
- delete ticket;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_rsc_alloc_mode_p_1) {
- mixer_handle mixer = mixer_create();
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_NONE);
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_rsc_alloc_mode_n_1) {
- mixer_handle mixer = mixer_create();
- CMixerMockPlayer p1;
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_INVALID_OPERATION);
- delete ticket;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_disable_audio_focus_setting_p_1) {
- mixer_handle mixer = mixer_create();
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer), MIXER_ERROR_TYPE_NONE);
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_disable_audio_focus_setting_n_1) {
- mixer_handle mixer = mixer_create();
- CMixerMockPlayer p1;
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer),
- MIXER_ERROR_TYPE_INVALID_OPERATION);
- delete ticket;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_audio_focus_p_1) {
- mixer_handle mixer = mixer_create();
- CMixerMockPlayer p1;
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_EQ(mixer_set_audio_focus(mixer, &p1), MIXER_ERROR_TYPE_NONE);
- delete ticket;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_audio_focus_p_2) {
- mixer_handle mixer = mixer_create();
- CMixerMockPlayer p1, p2;
-
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
- MixerTicket* ticket2 = (MixerTicket*)mixer_create_ticket(mixer, &p2);
-
- ticket->RegisterListener(p1.listener_);
- ticket2->RegisterListener(p2.listener_);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer, &p2), MIXER_ERROR_TYPE_NONE);
-
- delete ticket;
- delete ticket2;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_audio_focus_n_2) {
- mixer_handle mixer = mixer_create();
- mixer_disable_audio_focus_setting(mixer);
- CMixerMockPlayer p1;
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_EQ(mixer_set_audio_focus(mixer, &p1),
- MIXER_ERROR_TYPE_INVALID_OPERATION);
- delete ticket;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_display_p_1) {
- mixer_handle mixer = mixer_create();
- EXPECT_EQ(mixer_set_display(mixer, MIXER_DISPLAY_TYPE_OVERLAY,
- Utility::Instance().GetWindow()),
- MIXER_ERROR_TYPE_NONE);
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_commit_p_1) {
- mixer_handle mixer = mixer_create();
- CMixerMockPlayer p1(1, 1, 1, 1);
- CMixerMockPlayer p2(2, 2, 2, 2);
-
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
- MixerTicket* ticket2 = (MixerTicket*)mixer_create_ticket(mixer, &p2);
-
- ticket->RegisterListener(p1.listener_);
- ticket2->RegisterListener(p2.listener_);
-
- EXPECT_EQ(mixer_commit(mixer), MIXER_ERROR_TYPE_NONE);
-
- delete ticket;
- delete ticket2;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_display_roi_p_1) {
- mixer_handle mixer = mixer_create();
- CMixerMockPlayer p1;
-
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
-
- ticket->RegisterListener(p1.listener_);
- EXPECT_EQ(mixer_set_display_roi(mixer, 11, 11, 22, 22),
- MIXER_ERROR_TYPE_NONE);
-
- delete ticket;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_display_mode_p_1) {
- mixer_handle mixer = mixer_create();
- CMixerMockPlayer p1;
-
- MixerTicket* ticket = (MixerTicket*)mixer_create_ticket(mixer, &p1);
-
- ticket->RegisterListener(p1.listener_);
- EXPECT_EQ(mixer_set_display_mode(mixer, MIXER_DISPLAY_MODE_DST_ROI),
- MIXER_ERROR_TYPE_NONE);
-
- delete ticket;
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_start_p_1) {
- mixer_handle mixer = mixer_create();
- mixer_set_display(mixer, MIXER_DISPLAY_TYPE_OVERLAY,
- Utility::Instance().GetWindow());
- mixer_set_display_roi(mixer, 0, 0, 1920, 1080);
- EXPECT_EQ(mixer_start(mixer), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(3));
- EXPECT_EQ(mixer_stop(mixer), MIXER_ERROR_TYPE_NONE);
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_alternative_video_scaler_p_1) {
- mixer_handle mixer = mixer_create();
- EXPECT_EQ(mixer_set_alternative_video_scaler(mixer), MIXER_ERROR_TYPE_NONE);
- mixer_set_display(mixer, MIXER_DISPLAY_TYPE_OVERLAY,
- Utility::Instance().GetWindow());
- mixer_set_display_roi(mixer, 0, 0, 1920, 1080);
-
- EXPECT_EQ(mixer_start(mixer), MIXER_ERROR_TYPE_NONE);
- std::this_thread::sleep_for(std::chrono::seconds(3));
- EXPECT_EQ(mixer_stop(mixer), MIXER_ERROR_TYPE_NONE);
- mixer_destroy(mixer);
-}
-
-TEST(CMixerTest, vdapi_mixer_set_on_resource_conflict_cb_p_1) {
- mixer_handle mixer = mixer_create();
- EXPECT_EQ(mixer_set_resource_conflicted_cb(mixer, nullptr, nullptr),
- MIXER_ERROR_TYPE_NONE);
- mixer_destroy(mixer);
-}
-
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-#include <gtest/gtest.h>
-
-#include "esplusplayer_capi/esplusplayer_capi.h"
-#include "mixer_capi/mixer_capi.h"
-#include "ut/include/plusplayer/utility.h"
-#include "ut/include/streamreader.hpp"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-using namespace utils;
-using namespace std;
-
-using utils::Utility;
-std::string uri_1 = "youtube/";
-std::string uri_2 = "bunny/";
-
-// max playing duration : 10 sec => see EsStreamReader::ReadNextPacket()
-constexpr int kEsPlayingTime = 1; // (sec)
-
-class CMixerEsppTestF : public ::testing::Test {
- public:
- explicit CMixerEsppTestF(void)
- : util_(Utility::Instance()),
- mixer_(nullptr),
- player1_(nullptr),
- player2_(nullptr),
- player3_(nullptr),
- player4_(nullptr){};
- ~CMixerEsppTestF(void){};
-
- static void SetUpTestCase() {
- ESPacketDownloader::Init();
- std::cout << "SetUpTestCase()" << std::endl;
- }
-
- static void TearDownTestCase() {}
-
- virtual void SetUp(void) override {
- LOG_ERROR("%s", util_.GetCurrentTestName());
- mixer_ = mixer_create();
- mixer_set_display(mixer_, MIXER_DISPLAY_TYPE_OVERLAY, util_.GetWindow());
-
- roi1_.x = 20;
- roi1_.y = 20;
- roi1_.w = 960;
- roi1_.h = 540;
-
- roi2_.x = 1000;
- roi2_.y = 20;
- roi2_.w = 720;
- roi2_.h = 480;
-
- roi3_.x = 20;
- roi3_.y = 520;
- roi3_.w = 720;
- roi3_.h = 480;
-
- roi4_.x = 1000;
- roi4_.y = 520;
- roi4_.w = 720;
- roi4_.h = 480;
- }
-
- virtual void TearDown(void) override {
- util_.DestroyESPP(player1_);
- util_.DestroyESPP(player2_);
- util_.DestroyESPP(player3_);
- util_.DestroyESPP(player4_);
- mixer_destroy(mixer_);
- player1_ = nullptr;
- player2_ = nullptr;
- player3_ = nullptr;
- player4_ = nullptr;
- mixer_ = nullptr;
- LOG_ERROR("%s", util_.GetCurrentTestName());
- }
-
- public:
- Utility& util_;
- mixer_handle mixer_;
- esplusplayer_handle player1_;
- esplusplayer_handle player2_;
- esplusplayer_handle player3_;
- esplusplayer_handle player4_;
- Geometry roi1_;
- Geometry roi2_;
- Geometry roi3_;
- Geometry roi4_;
-};
-
-TEST(CMixerEsppTest, vdapi_mixer_create_destroy_p_1) {
- mixer_handle mixer = mixer_create();
- ASSERT_NE(mixer, nullptr);
- EXPECT_EQ(mixer_destroy(mixer), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_start_stop_p_1) {
- player1_ = util_.GetPreparedMixESPP(uri_2, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetPreparedMixESPP(uri_2, mixer_, roi2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_EQ(esplusplayer_start(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_start(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(mixer_start(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kEsPlayingTime));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player2_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_get_max_allowed_number_of_player_p_1) {
- int max_num = mixer_get_max_allowed_number_of_player(mixer_);
- constexpr int MAX_NUM = 3;
- EXPECT_EQ(MAX_NUM, max_num);
-}
-
-TEST(CMixerEsppTest, vdapi_mixer_set_display_p_1) {
- mixer_handle mixer = mixer_create();
- ASSERT_NE(mixer, nullptr);
- Utility& util = Utility::Instance();
- EXPECT_EQ(
- mixer_set_display(mixer, MIXER_DISPLAY_TYPE_OVERLAY, util.GetWindow()),
- MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_destroy(mixer), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_display_mode_p_1) {
- EXPECT_EQ(mixer_set_display_mode(mixer_, MIXER_DISPLAY_MODE_DST_ROI),
- MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_display_roi_p_1) {
- EXPECT_EQ(mixer_set_display_mode(mixer_, MIXER_DISPLAY_MODE_DST_ROI),
- MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_set_display_roi(mixer_, 0, 0, 1920, 1080),
- MIXER_ERROR_TYPE_NONE);
-
- player1_ = util_.GetStartedMixESPP(uri_2, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- mixer_start(mixer_);
- std::this_thread::sleep_for(std::chrono::seconds(kEsPlayingTime));
-
- EXPECT_EQ(mixer_set_display_roi(mixer_, roi2_.x, roi2_.y, roi2_.w, roi2_.h),
- MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kEsPlayingTime));
-
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_rsc_alloc_mode_p_1) {
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_NONE);
- mixer_stop(mixer_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_rsc_alloc_mode_n_1) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_INVALID_OPERATION);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_set_video_codec_type_p_1) {
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_NONE);
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_set_video_codec_type(
- player1_, ESPLUSPLAYER_VIDEO_CODEC_TYPE_HW_N_DECODING),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_set_video_codec_type_p_2) {
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_NONE);
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_set_video_codec_type(player1_,
- ESPLUSPLAYER_VIDEO_CODEC_TYPE_HW),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_set_video_codec_type_n_1) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_set_video_codec_type(
- player1_, ESPLUSPLAYER_VIDEO_CODEC_TYPE_HW_N_DECODING),
- ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION);
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_set_video_codec_type_n_2) {
- player1_ = util_.GetOpenedESPP(roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_set_video_codec_type(
- player1_, ESPLUSPLAYER_VIDEO_CODEC_TYPE_HW_N_DECODING),
- ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION);
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_set_video_codec_type_n_3) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_set_video_codec_type(player1_,
- ESPLUSPLAYER_VIDEO_CODEC_TYPE_HW),
- ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION);
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_esplusplayer_set_alternative_video_resource_p_1) {
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DISABLE),
- MIXER_ERROR_TYPE_NONE);
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_set_alternative_video_resource(player1_, 0),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_set_alternative_video_resource_n_1) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_set_alternative_video_resource(player1_, 0),
- ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_set_alternative_video_resource_n_2) {
- EXPECT_EQ(mixer_set_rsc_alloc_mode(mixer_, MIXER_RSC_ALLOC_MODE_DEFAULT),
- MIXER_ERROR_TYPE_NONE);
- player1_ = util_.GetPreparedMixESPP(uri_2, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- EXPECT_EQ(esplusplayer_deactivate(player1_, ESPLUSPLAYER_STREAM_TYPE_VIDEO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_alternative_video_resource(player1_, 0),
- ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION);
-
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_disable_audio_focus_setting_p_1) {
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_disable_audio_focus_setting_p_2) {
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer_), MIXER_ERROR_TYPE_NONE);
- player1_ = util_.GetPreparedMixESPP(uri_2, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- mixer_start(mixer_);
-
- EXPECT_EQ(esplusplayer_deactivate(player1_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- MIXER_ERROR_TYPE_NONE);
-
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_disable_audio_focus_setting_n_1) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer_),
- MIXER_ERROR_TYPE_INVALID_OPERATION);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_deactivate_p_1) {
- EXPECT_EQ(mixer_disable_audio_focus_setting(mixer_), MIXER_ERROR_TYPE_NONE);
-
- player1_ = util_.GetPreparedMixESPP(uri_2, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_deactivate(player1_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_esplusplayer_deactivate_n_1) {
- player1_ = util_.GetPreparedMixESPP(uri_2, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- EXPECT_EQ(esplusplayer_deactivate(player1_, ESPLUSPLAYER_STREAM_TYPE_AUDIO),
- ESPLUSPLAYER_ERROR_TYPE_INVALID_OPERATION);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_alternative_video_scaler_p_1) {
- EXPECT_EQ(mixer_set_alternative_video_scaler(mixer_),
- MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_audio_focus_p_1) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
-
- EXPECT_EQ(mixer_set_audio_focus(mixer_, player1_), MIXER_ERROR_TYPE_NONE);
-
- EXPECT_EQ(esplusplayer_close(player1_), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(mixer_stop(mixer_), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_commit_p_1) {
- player1_ = util_.GetStartedMixESPP(uri_2, mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- mixer_start(mixer_);
-
- std::this_thread::sleep_for(std::chrono::seconds(kEsPlayingTime));
-
- esplusplayer_set_display_roi(player1_, roi3_.x, roi3_.y, roi3_.w, roi3_.h);
- EXPECT_EQ(mixer_commit(mixer_), MIXER_ERROR_TYPE_NONE);
-
- std::this_thread::sleep_for(std::chrono::seconds(kEsPlayingTime));
-
- mixer_stop(mixer_);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_resolution_p_1) {
- EXPECT_EQ(mixer_set_resolution(mixer_, 1920, 1080, 30, 1), MIXER_ERROR_TYPE_NONE);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_create_ticket_p_1) {
- player1_ = util_.GetOpenedMixESPP(mixer_, roi1_);
- ASSERT_NE(player1_, nullptr);
- void* ticket = mixer_create_ticket(mixer_, player1_);
- ASSERT_NE(ticket, nullptr);
- esplusplayer_close(player1_);
-}
-
-TEST_F(CMixerEsppTestF, vdapi_mixer_set_resource_conflicted_cb_p_1) {
- EXPECT_EQ(mixer_set_resource_conflicted_cb(mixer_, nullptr, nullptr),
- MIXER_ERROR_TYPE_NONE);
-}
-
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-#include <gtest/gtest.h>
-
-#include <iostream>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/mixer.h"
-#include "mixer/mixer_eventlistener.h"
-#include "mixer/mixerticket.h"
-#include "mixer/mixerticket_eventlistener.h"
-#include "ut/include/plusplayer/utility.h"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-using namespace utils;
-using namespace std;
-
-using utils::Utility;
-std::string dashuri =
- "";
-std::string httpuri = "";
-std::string hlsuri = "";
-std::string fhd1 =
- "";
-std::string fhd2 =
- "";
-std::string fhd3 =
- "";
-constexpr int kPlayingTime = 5; // sec
-
-//------------------------------------------------------------
-class MixerScenarioTestF : public ::testing::Test {
- public:
- explicit MixerScenarioTestF(void)
- : util_(Utility::Instance()),
- mixer_(nullptr),
- player1_(nullptr),
- player2_(nullptr),
- player3_(nullptr){};
- ~MixerScenarioTestF(void){};
-
- virtual void SetUp(void) override {
- LOG_ERROR("%s", util_.GetCurrentTestName());
- mixer_ = Mixer::Create();
- mixer_->SetDisplay(DisplayType::kOverlay, util_.GetWindow());
-#if 1
- geometry1_.x = 20;
- geometry1_.y = 20;
- geometry1_.w = 960;
- geometry1_.h = 540;
-
- geometry2_.x = 1000;
- geometry2_.y = 20;
- geometry2_.w = 720;
- geometry2_.h = 480;
-
- geometry3_.x = 20;
- geometry3_.y = 520;
- geometry3_.w = 720;
- geometry3_.h = 480;
-
- geometry4_.x = 1000;
- geometry4_.y = 520;
- geometry4_.w = 720;
- geometry4_.h = 480;
-#else
- geometry1_.x = 20;
- geometry1_.y = 20;
- geometry1_.w = 1180;
- geometry1_.h = 720;
-
- geometry2_.x = 1220;
- geometry2_.y = 20;
- geometry2_.w = 640;
- geometry2_.h = 480;
-
- geometry3_.x = 1220;
- geometry3_.y = 520;
- geometry3_.w = 640;
- geometry3_.h = 480;
-#endif
- }
-
- virtual void TearDown(void) override {
- util_.DestroyPlayer(player1_);
- util_.DestroyPlayer(player2_);
- util_.DestroyPlayer(player3_);
- mixer_.reset();
- LOG_ERROR("%s", util_.GetCurrentTestName());
- }
-
- public:
- Utility& util_;
- std::unique_ptr<Mixer> mixer_;
- PlusPlayer::Ptr player1_;
- PlusPlayer::Ptr player2_;
- PlusPlayer::Ptr player3_;
- PlusPlayer::Ptr player4_;
- Geometry geometry1_;
- Geometry geometry2_;
- Geometry geometry3_;
- Geometry geometry4_;
-};
-
-#if 0 // prepare async test
-TEST(MixerScenarioTest, OnePlayer) {
- AppWindow appwin(0, 0, 1920, 1080);
- // create player1
- auto player1 = plusplayer::PlusPlayer::Create();
-
- shared_ptr<FakeUserData> user_data = std::make_shared<FakeUserData>();
- shared_ptr<PlusPlayerMockEventListener> mock_eventlistener =
- std::make_shared<PlusPlayerMockEventListener>();
- shared_ptr<PlusPlayerFakeEventListener> fake_eventlistener =
- std::make_shared<PlusPlayerFakeEventListener>();
- mock_eventlistener->Bind(
- std::dynamic_pointer_cast<EventListener>(fake_eventlistener));
-
- ASSERT_NE(player1, nullptr);
- EXPECT_TRUE(player1->Open(hlsuri.c_str()));
- player1->RegisterListener(mock_eventlistener.get(), (void*)user_data.get());
- // set mixer mode
- EXPECT_TRUE(
- player1->SetDisplay(DisplayType::kOverlay, appwin.GetWindow().obj));
- Geometry geometry1;
- geometry1.x = 0;
- geometry1.y = 0;
- geometry1.w = 1920;
- geometry1.h = 1080;
- EXPECT_TRUE(player1->SetDisplayMode(DisplayMode::kDstRoi));
- EXPECT_TRUE(player1->SetDisplayRoi(geometry1));
- EXPECT_TRUE(player1->PrepareAsync());
- ASSERT_EQ(
- user_data->onPrepareDone
- .WaitForChange(PrepareStatus::kSuccess, DEFAULT_TIMEOUT_FOR_PREPARING)
- .get(),
- WatcherStatus::kSuccess);
- EXPECT_TRUE(player1->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
- EXPECT_TRUE(player1->Stop());
- EXPECT_TRUE(player1->Close());
- player1.reset();
-}
-
-TEST(MixerScenarioTest, Basic) {
- shared_ptr<FakeUserData> user_data1 = std::make_shared<FakeUserData>();
- shared_ptr<PlusPlayerMockEventListener> mock_eventlistener1 =
- std::make_shared<PlusPlayerMockEventListener>();
- shared_ptr<PlusPlayerFakeEventListener> fake_eventlistener1 =
- std::make_shared<PlusPlayerFakeEventListener>();
- mock_eventlistener1->Bind(
- std::dynamic_pointer_cast<EventListener>(fake_eventlistener1));
-
- shared_ptr<FakeUserData> user_data2 = std::make_shared<FakeUserData>();
- shared_ptr<PlusPlayerMockEventListener> mock_eventlistener2 =
- std::make_shared<PlusPlayerMockEventListener>();
- shared_ptr<PlusPlayerFakeEventListener> fake_eventlistener2 =
- std::make_shared<PlusPlayerFakeEventListener>();
- mock_eventlistener2->Bind(
- std::dynamic_pointer_cast<EventListener>(fake_eventlistener2));
-
- shared_ptr<FakeUserData> user_data3 = std::make_shared<FakeUserData>();
- shared_ptr<PlusPlayerMockEventListener> mock_eventlistener3 =
- std::make_shared<PlusPlayerMockEventListener>();
- shared_ptr<PlusPlayerFakeEventListener> fake_eventlistener3 =
- std::make_shared<PlusPlayerFakeEventListener>();
- mock_eventlistener3->Bind(
- std::dynamic_pointer_cast<EventListener>(fake_eventlistener3));
-
- AppWindow appwin(0, 0, 1920, 1080);
-
- // create mixer
- auto mixer = Mixer::Create();
- ASSERT_NE(mixer, nullptr);
- EXPECT_TRUE(mixer->SetDisplay(DisplayType::kOverlay, appwin.GetWindow().obj));
-
- // create player1
- auto player1 = plusplayer::PlusPlayer::Create();
- ASSERT_NE(player1, nullptr);
- EXPECT_TRUE(player1->Open(hlsuri.c_str()));
- player1->RegisterListener(mock_eventlistener1.get(), (void*)user_data1.get());
- // set mixer mode
- EXPECT_TRUE(player1->SetDisplay(DisplayType::kMixer, mixer.get()));
- Geometry geometry1;
- geometry1.x = 20;
- geometry1.y = 20;
- geometry1.w = 1180;
- geometry1.h = 720;
- EXPECT_TRUE(player1->SetDisplayRoi(geometry1));
- // set audio focus
- EXPECT_TRUE(mixer->SetAudioFocus(player1.get()));
- EXPECT_TRUE(player1->PrepareAsync());
-
- // create player2
- auto player2 = plusplayer::PlusPlayer::Create();
- EXPECT_NE(player2, nullptr);
- EXPECT_TRUE(player2->Open(hlsuri.c_str()));
- player2->RegisterListener(mock_eventlistener2.get(), (void*)user_data2.get());
- // set mixer mode
- EXPECT_TRUE(player2->SetDisplay(DisplayType::kMixer, mixer.get()));
- Geometry geometry2;
- geometry2.x = 1220;
- geometry2.y = 20;
- geometry2.w = 640;
- geometry2.h = 480;
- EXPECT_TRUE(player2->SetDisplayRoi(geometry2));
- EXPECT_TRUE(player2->PrepareAsync());
-
- // create player3
- auto player3 = plusplayer::PlusPlayer::Create();
- EXPECT_NE(player3, nullptr);
- EXPECT_TRUE(player3->Open(hlsuri.c_str()));
- player3->RegisterListener(mock_eventlistener3.get(), (void*)user_data3.get());
- // set mixer mode
- EXPECT_TRUE(player3->SetDisplay(DisplayType::kMixer, mixer.get()));
- Geometry geometry3;
- geometry3.x = 1220;
- geometry3.y = 520;
- geometry3.w = 640;
- geometry3.h = 480;
- EXPECT_TRUE(player3->SetDisplayRoi(geometry3));
- EXPECT_TRUE(player3->PrepareAsync());
-
- ASSERT_EQ(
- user_data1->onPrepareDone
- .WaitForChange(PrepareStatus::kSuccess, DEFAULT_TIMEOUT_FOR_PREPARING)
- .get(),
- WatcherStatus::kSuccess);
-
- ASSERT_EQ(
- user_data2->onPrepareDone
- .WaitForChange(PrepareStatus::kSuccess, DEFAULT_TIMEOUT_FOR_PREPARING)
- .get(),
- WatcherStatus::kSuccess);
-
- ASSERT_EQ(
- user_data3->onPrepareDone
- .WaitForChange(PrepareStatus::kSuccess, DEFAULT_TIMEOUT_FOR_PREPARING)
- .get(),
- WatcherStatus::kSuccess);
-
- EXPECT_TRUE(player1->Start());
- EXPECT_TRUE(player2->Start());
- EXPECT_TRUE(player3->Start());
-
- EXPECT_TRUE(mixer->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer->Stop());
- EXPECT_TRUE(player1->Stop());
- EXPECT_TRUE(player2->Stop());
- EXPECT_TRUE(player3->Stop());
-
- EXPECT_TRUE(player1->Close());
- EXPECT_TRUE(player2->Close());
- EXPECT_TRUE(player3->Close());
-
- player1.reset();
- player2.reset();
- player3.reset();
- mixer.reset();
-}
-#endif
-#if 0 // memory check TC
-class MixerScenarioMemTestF : public ::testing::Test {
- public:
- explicit MixerScenarioMemTestF(void) : util_(Utility::Instance()){};
- ~MixerScenarioMemTestF(void){};
-
- virtual void SetUp(void) override {
- LOG_ERROR("%s", util_.GetCurrentTestName());
- geometry1_.x = 20;
- geometry1_.y = 20;
- geometry1_.w = 960;
- geometry1_.h = 540;
-
- geometry2_.x = 1000;
- geometry2_.y = 20;
- geometry2_.w = 720;
- geometry2_.h = 480;
-
- geometry3_.x = 1000;
- geometry3_.y = 520;
- geometry3_.w = 720;
- geometry3_.h = 480;
- }
-
- virtual void TearDown(void) override {
- LOG_ERROR("%s", util_.GetCurrentTestName());
- }
-
- public:
- Utility& util_;
- Geometry geometry1_;
- Geometry geometry2_;
- Geometry geometry3_;
-};
-
-TEST(MixerScenarioMemTestF, RealNothing) {
- std::this_thread::sleep_for(std::chrono::seconds(20));
-}
-
-TEST_F(MixerScenarioMemTestF, OnlyWindow) {
- std::this_thread::sleep_for(std::chrono::seconds(20));
-}
-
-TEST_F(MixerScenarioMemTestF, OnePlayer) {
- // create player1
- auto player1_ = util_.GetOpenedPlusPlayer(hlsuri);
- ASSERT_NE(player1_, nullptr);
- EXPECT_TRUE(player1_->Prepare());
- EXPECT_TRUE(player1_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(40));
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player1_->Close());
- player1_.reset();
-}
-
-TEST_F(MixerScenarioMemTestF, MixerThreePlayer) {
- auto mixer_ = Mixer::Create();
- mixer_->SetDisplay(DisplayType::kOverlay, util_.GetWindow());
- auto player1_ =
- util_.GetOpenedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
- auto player2_ =
- util_.GetOpenedMixPlusPlayer(hlsuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
- auto player3_ =
- util_.GetOpenedMixPlusPlayer(hlsuri, mixer_.get(), geometry3_);
- ASSERT_NE(player3_, nullptr);
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player1_.get()));
-
- EXPECT_TRUE(player1_->Prepare());
- EXPECT_TRUE(player2_->Prepare());
- EXPECT_TRUE(player3_->Prepare());
-
- EXPECT_TRUE(player1_->Start());
- EXPECT_TRUE(player2_->Start());
- EXPECT_TRUE(player3_->Start());
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(40));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
- EXPECT_TRUE(player3_->Stop());
-
- EXPECT_TRUE(player1_->Close());
- EXPECT_TRUE(player2_->Close());
- EXPECT_TRUE(player3_->Close());
-
- player1_.reset();
- player2_.reset();
- player3_.reset();
-
- mixer_.reset();
-}
-
-TEST_F(MixerScenarioMemTestF, MixerOnePlayer) {
- auto mixer_ = Mixer::Create();
- mixer_->SetDisplay(DisplayType::kOverlay, util_.GetWindow());
- auto player1_ =
- util_.GetOpenedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player1_.get()));
-
- EXPECT_TRUE(player1_->Prepare());
-
- EXPECT_TRUE(player1_->Start());
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(40));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player1_->Stop());
-
- EXPECT_TRUE(player1_->Close());
-
- player1_.reset();
- mixer_.reset();
-}
-#endif
-
-#if 1 // normal mixer test
-TEST_F(MixerScenarioTestF, Basic) {
- player1_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player1_.get()));
-
- EXPECT_TRUE(player1_->Prepare());
- EXPECT_TRUE(player2_->Prepare());
-
- EXPECT_TRUE(player1_->Start());
- EXPECT_TRUE(player2_->Start());
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, SinglePlay) {
- player1_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player1_.get()));
-
- EXPECT_TRUE(player1_->Prepare());
-
- EXPECT_TRUE(player1_->Start());
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player1_->Stop());
-}
-
-#if 0 // n-decoding test ut : need to call n-decoding mode set api of player
-TEST_F(MixerScenarioTestF, MaxPlay) {
- player1_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
- player3_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player3_, nullptr);
- player4_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player4_, nullptr);
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player1_.get()));
-
- EXPECT_TRUE(player1_->Prepare());
- EXPECT_TRUE(player2_->Prepare());
- EXPECT_TRUE(player3_->Prepare());
- EXPECT_TRUE(player4_->Prepare());
-
- EXPECT_TRUE(player1_->Start());
- EXPECT_TRUE(player2_->Start());
- EXPECT_TRUE(player3_->Start());
- EXPECT_TRUE(player4_->Start());
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
- EXPECT_TRUE(player3_->Stop());
- EXPECT_TRUE(player4_->Stop());
-}
-#endif
-
-TEST_F(MixerScenarioTestF, DetachAttach) {
- player1_ = util_.GetStartedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetStartedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
- EXPECT_TRUE(player1_->Stop());
-
- player3_ = util_.GetStartedMixPlusPlayer(dashuri, mixer_.get(), geometry3_);
- ASSERT_NE(player3_, nullptr);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player2_->Stop());
- EXPECT_TRUE(player3_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, DetachAttach1) {
- player1_ = util_.GetStartedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetStartedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
- EXPECT_TRUE(player1_->Stop());
-
- player3_ = util_.GetStartedMixPlusPlayer(dashuri, mixer_.get(), geometry1_);
- ASSERT_NE(player3_, nullptr);
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player2_->Stop());
- EXPECT_TRUE(player3_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, SetROI) {
- player1_ = util_.GetStartedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetStartedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(player1_->SetDisplayRoi(geometry2_));
- EXPECT_TRUE(player2_->SetDisplayRoi(geometry1_));
- EXPECT_TRUE(mixer_->Commit());
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, SetROI1) {
- player1_ = util_.GetStartedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetStartedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->Start());
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(player1_->SetDisplayRoi(geometry2_));
- EXPECT_TRUE(player2_->SetDisplayRoi(geometry3_));
- EXPECT_TRUE(mixer_->Commit());
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->Stop());
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, CheckMaxMixedPlayer) {
- player1_ = util_.GetOpenedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
- player2_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
- player3_ = util_.GetOpenedMixPlusPlayer(dashuri, mixer_.get(), geometry3_);
- ASSERT_NE(player3_, nullptr);
- auto player4 =
- util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry3_);
- ASSERT_NE(player4, nullptr);
-
- EXPECT_TRUE(player1_->Prepare());
- EXPECT_TRUE(player2_->Prepare());
- EXPECT_TRUE(player3_->Prepare());
-
- EXPECT_FALSE(player4->Prepare());
-
- EXPECT_TRUE(player4->Close());
- EXPECT_TRUE(mixer_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, SetAudioFocus) {
- player1_ = util_.GetOpenedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetOpenedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player1_.get()));
-
- EXPECT_TRUE(player1_->Prepare());
- EXPECT_TRUE(player2_->Prepare());
-
- EXPECT_TRUE(player1_->Start());
- EXPECT_TRUE(player2_->Start());
-
- EXPECT_TRUE(mixer_->Start());
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player2_.get()));
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(mixer_->SetAudioFocus(player1_.get()));
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
- EXPECT_TRUE(mixer_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, SetAudioFocus1) {
- player1_ = util_.GetStartedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
-
- player2_ = util_.GetStartedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->Start());
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
- EXPECT_TRUE(mixer_->Stop());
-}
-
-TEST_F(MixerScenarioTestF, SetAudioFocus2) {
- player1_ = util_.GetStartedMixPlusPlayer(hlsuri, mixer_.get(), geometry1_);
- ASSERT_NE(player1_, nullptr);
-
- EXPECT_FALSE(mixer_->SetAudioFocus(nullptr));
- player2_ = util_.GetStartedMixPlusPlayer(httpuri, mixer_.get(), geometry2_);
- ASSERT_NE(player2_, nullptr);
-
- EXPECT_TRUE(mixer_->Start());
-
- std::this_thread::sleep_for(std::chrono::seconds(kPlayingTime));
-
- EXPECT_TRUE(player1_->Stop());
- EXPECT_TRUE(player2_->Stop());
- EXPECT_TRUE(mixer_->Stop());
-}
-#endif
\ No newline at end of file
+++ /dev/null
-//
-// @ Copyright [2020] <S/W Platform, Visual Display, Samsung Electronics>
-//
-#include <gtest/gtest.h>
-
-#include "core/utils/plusplayer_log.h"
-#include "mixer/mixer.h"
-#include "mixer/mixer_eventlistener.h"
-#include "mixer/mixerticket.h"
-#include "mixer/mixerticket_eventlistener.h"
-#include "ut/include/appwindow.h"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-
-class MixerTicketMockPlayer {
- public:
- MixerTicketMockPlayer() { listener_ = new MyTicketListener(this); }
- MixerTicketMockPlayer(int x, int y, int w, int h) {
- listener_ = new MyTicketListener(this);
- display_info_.geometry.x = x;
- display_info_.geometry.y = y;
- display_info_.geometry.w = w;
- display_info_.geometry.h = h;
- }
- ~MixerTicketMockPlayer() { delete listener_; }
-
- class MyTicketListener : public MixerTicketEventListener {
- public:
- explicit MyTicketListener(MixerTicketMockPlayer* handler)
- : handler_(handler){};
- bool OnAudioFocusChanged(bool active) {
- LOG_INFO("My OnAudioFocusChanged [%d] player [%p]", active, handler_);
- return true;
- }
-
- bool OnUpdateDisplayInfo(const DisplayInfo& cur_info,
- DisplayInfo* new_info) {
- *new_info = handler_->display_info_;
- LOG_INFO("OnUpdateDisplayInfo x[%d] y[%d]",
- handler_->display_info_.geometry.x,
- handler_->display_info_.geometry.y);
- return true;
- }
- MixerTicketMockPlayer* handler_ = nullptr;
- };
-
- public:
- MixerTicketEventListener* listener_ = nullptr;
- DisplayInfo display_info_;
-};
-
-class MyMixerListener : public MixerEventListener {
- public:
- MyMixerListener() {}
- ~MyMixerListener() {}
- void OnError() {
- LOG_INFO(" listener [%p]", this);
- }
- void OnResourceConflicted() {
- LOG_INFO("MyOnResourceConflicted listener[%p]", this);
- }
-};
-
-TEST(MixerticketTest, MixerTicketRenderBasic) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1, p2;
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- MixerTicket* ticket2 = mixer->CreateTicket(&p2);
- // EXPECT_TRUE(ticket->Render());
- // EXPECT_TRUE(ticket2->Render());
- delete ticket;
- delete ticket2;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTicketRegisterListener) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- EXPECT_TRUE(ticket->RegisterListener(p1.listener_));
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTicketPrepare) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
- EXPECT_TRUE(ticket->Prepare());
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketGetAvailableResourceType_1) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
-
- ticket->RegisterListener(p1.listener_);
- ResourceType type;
- EXPECT_TRUE(
- ticket->GetAvailableResourceType(ResourceCategory::kVideoDecoder, &type));
-
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketGetAvailableResourceType_2) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
-
- mixer->SetRscAllocMode(RscAllocMode::kDisable);
- MixerTicket* ticket = mixer->CreateTicket(&p1);
-
- ticket->RegisterListener(p1.listener_);
- ResourceType type;
- EXPECT_FALSE(
- ticket->GetAvailableResourceType(ResourceCategory::kVideoDecoder, &type));
-
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketAlloc) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
-
- ticket->RegisterListener(p1.listener_);
- ResourceType type;
- EXPECT_TRUE(
- ticket->GetAvailableResourceType(ResourceCategory::kVideoDecoder, &type));
- EXPECT_TRUE(ticket->Alloc(ResourceCategory::kVideoDecoder, type));
-
- EXPECT_TRUE(
- ticket->GetAvailableResourceType(ResourceCategory::kVideoDecoder, &type));
- EXPECT_TRUE(ticket->Alloc(ResourceCategory::kVideoDecoder, type));
-
- EXPECT_TRUE(
- ticket->GetAvailableResourceType(ResourceCategory::kVideoDecoder, &type));
- EXPECT_TRUE(ticket->Alloc(ResourceCategory::kVideoDecoder, type));
-
- EXPECT_FALSE(
- ticket->GetAvailableResourceType(ResourceCategory::kVideoDecoder, &type));
- EXPECT_FALSE(ticket->Alloc(ResourceCategory::kVideoDecoder, type));
-
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketDeallocResource) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1, p2, p3;
-
- MixerTicket* ticket1 = mixer->CreateTicket(&p1);
-
- ResourceType type;
- EXPECT_TRUE(ticket1->GetAvailableResourceType(ResourceCategory::kVideoDecoder,
- &type));
- EXPECT_TRUE(ticket1->Alloc(ResourceCategory::kVideoDecoder, type));
-
- delete ticket1;
-
- MixerTicket* ticket2 = mixer->CreateTicket(&p2);
- EXPECT_TRUE(ticket2->GetAvailableResourceType(ResourceCategory::kVideoDecoder,
- &type));
- EXPECT_TRUE(ticket2->Alloc(ResourceCategory::kVideoDecoder, type));
-
- MixerTicket* ticket3 = mixer->CreateTicket(&p3);
- EXPECT_TRUE(ticket3->GetAvailableResourceType(ResourceCategory::kVideoDecoder,
- &type));
- EXPECT_TRUE(ticket3->Alloc(ResourceCategory::kVideoDecoder, type));
-
- delete ticket2;
- delete ticket3;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketIsAudioFocusHandler_1) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
-
- mixer->DisableAudioFocusSetting();
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
-
- EXPECT_FALSE(ticket->IsAudioFocusHandler());
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketIsAudioFocusHandler_2) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
-
- EXPECT_TRUE(ticket->IsAudioFocusHandler());
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketIsRscAllocHandler_1) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
-
- mixer->SetRscAllocMode(RscAllocMode::kDisable);
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
-
- EXPECT_FALSE(ticket->IsRscAllocHandler());
- delete ticket;
- mixer.reset();
-}
-
-TEST(MixerticketTest, MixerTiecketIsRscAllocHandler_2) {
- std::unique_ptr<Mixer> mixer = Mixer::Create();
- MixerTicketMockPlayer p1;
-
- MixerTicket* ticket = mixer->CreateTicket(&p1);
- ticket->RegisterListener(p1.listener_);
-
- EXPECT_TRUE(ticket->IsRscAllocHandler());
- delete ticket;
- mixer.reset();
-}
\ No newline at end of file
+++ /dev/null
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include "mixer/constant.h"
-#include "mixer/matcher.h"
-#include "mixer/mock/mock_memallocator.h"
-#include "mixer/mock/mock_renderableobj.h"
-#include "mixer/mock/mock_renderableobj_factory.h"
-#include "mixer/mock/mock_renderer_evtlistener.h"
-#include "mixer/mock/mock_vpcollection.h"
-#include "mixer/mock/mock_vpmanipulator.h"
-#include "mixer/mock/mock_vpscaler.h"
-#include "mixer/renderer.h"
-
-using namespace plusplayer;
-using namespace plusplayer_ut;
-
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::AtLeast;
-using ::testing::DoAll;
-using ::testing::Eq;
-using ::testing::Field;
-using ::testing::Return;
-using ::testing::ReturnPointee;
-using ::testing::SetArgReferee;
-using ::testing::SizeIs;
-
-/********************************************************************************************
- * InvalidRendererTest
- */
-class InvalidRendererTest : public ::testing::Test {
- public:
- virtual void SetUp() override {
- ON_CALL(GetRenderableObjectFactory(), CreateRenderableObject(_, _))
- .WillByDefault(Return(nullptr));
-
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kInvalidWidth, kInvalidHeight));
-
- renderer_ = std::unique_ptr<Renderer>(new Renderer(
- GetRenderableObjectFactory(),
- GetResolutionInfo(kInvalidWidth, kInvalidHeight, kInvalidFramerateNum,
- kInvalidFramerateDen),
- nullptr));
-
- ASSERT_FALSE(renderer_->IsValid());
- }
- virtual void TearDown() override {}
-
- protected:
- Renderer& GetRenderer() { return *renderer_; }
-
- const MockRenderableObjectFactory& GetRenderableObjectFactory() const {
- return mock_mixed_frame_factory_;
- }
- const MockVideoPlaneScaler& GetVideoPlaneScaler() const {
- return mock_vpscaler_;
- }
- const MockVideoPlaneCollection* GetVideoPlaneCollection() const {
- return &videoplanecollection_;
- }
-
- private:
- std::unique_ptr<Renderer> renderer_;
- MockRenderableObjectFactory mock_mixed_frame_factory_;
- MockVideoPlaneScaler mock_vpscaler_;
- MockVideoPlaneCollection videoplanecollection_;
-};
-
-TEST_F(InvalidRendererTest, Start) { EXPECT_FALSE(GetRenderer().Start()); }
-
-TEST_F(InvalidRendererTest, Stop) { EXPECT_FALSE(GetRenderer().Stop()); }
-
-TEST_F(InvalidRendererTest, ChangeRenderingSpeed) {
- EXPECT_FALSE(
- GetRenderer().ChangeRenderingSpeed(kFastFramerateNum, kFastFramerateDen));
-}
-
-TEST_F(InvalidRendererTest, Render) {
- EXPECT_FALSE(GetRenderer().Render(
- &GetVideoPlaneScaler(), GetVideoPlaneCollection(),
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-/********************************************************************************************
- * RendererConstructionTest
- */
-class RendererConstructionTest : public ::testing::Test {
- public:
- explicit RendererConstructionTest() {}
- virtual ~RendererConstructionTest() {}
- virtual void SetUp() override {
- mock_mixed_frame_ = new MockRenderableObject();
-
- ON_CALL(GetRenderableObject(), IsValid()).WillByDefault(Return(true));
-
- ON_CALL(GetRenderableObjectFactory(), CreateRenderableObject(_, _))
- .WillByDefault(Return(mock_mixed_frame_));
- }
- virtual void TearDown() override {}
-
- protected:
- MockRenderableObject& GetRenderableObject() { return *mock_mixed_frame_; }
- const MockRenderableObjectFactory& GetRenderableObjectFactory() const {
- return mock_mixed_frame_factory_;
- }
- MockRendererEventListener* GetListener() { return nullptr; }
-
- private:
- MockRenderableObject* mock_mixed_frame_;
- MockRenderableObjectFactory mock_mixed_frame_factory_;
-};
-
-TEST_F(RendererConstructionTest, IsValid) {
- EXPECT_CALL(GetRenderableObject(), IsValid()).Times(AtLeast(1));
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kDefaultWidth, kDefaultHeight))
- .Times(1);
-
- Renderer renderer(
- GetRenderableObjectFactory(),
- GetResolutionInfo(kDefaultWidth, kDefaultHeight, kDefaultFramerateNum,
- kDefaultFramerateDen),
- GetListener());
-
- EXPECT_TRUE(renderer.IsValid());
-}
-
-TEST_F(RendererConstructionTest, IsValid_WithReturnNullMixedFrame) {
- // FIXME(bayle.park): memleak will occur by mock_mixed_frame_
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kDefaultWidth, kDefaultHeight))
- .WillOnce(Return(nullptr));
-
- Renderer renderer(
- GetRenderableObjectFactory(),
- GetResolutionInfo(kDefaultWidth, kDefaultHeight, kDefaultFramerateNum,
- kDefaultFramerateDen),
- GetListener());
-
- EXPECT_FALSE(renderer.IsValid());
-}
-
-TEST_F(RendererConstructionTest, IsValid_WithInvalidMixedFrame) {
- EXPECT_CALL(GetRenderableObject(), IsValid()).WillRepeatedly(Return(false));
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kDefaultWidth, kDefaultHeight))
- .Times(1);
-
- Renderer renderer(
- GetRenderableObjectFactory(),
- GetResolutionInfo(kDefaultWidth, kDefaultHeight, kDefaultFramerateNum,
- kDefaultFramerateDen),
- GetListener());
-
- EXPECT_FALSE(renderer.IsValid());
-}
-
-/********************************************************************************************
- * RendererTest
- */
-class RendererTest : public ::testing::Test {
- public:
- explicit RendererTest() {}
- virtual ~RendererTest() {}
- virtual void SetUp() override {
- mock_mixed_frame_ = new MockRenderableObject();
-
- ON_CALL(GetRenderableObject(), GetVideoPlaneManipInfo())
- .WillByDefault(Return(std::vector<VideoPlaneManipulableInfo>(
- {kYComponentDestVMInfo, kUVComponentDestVMInfo})));
- ON_CALL(GetRenderableObject(), IsValid()).WillByDefault(Return(true));
- ON_CALL(GetRenderableObject(), GetWidth())
- .WillByDefault(Return(kDefaultWidth));
- ON_CALL(GetRenderableObject(), GetHeight())
- .WillByDefault(Return(kDefaultHeight));
- ON_CALL(GetRenderableObject(), GetSize())
- .WillByDefault(Return(kExpectedDefaultByteSize));
- ON_CALL(GetRenderableObject(), Render(_, _, _)).WillByDefault(Return(true));
- ON_CALL(GetRenderableObject(), Export(_))
- .WillByDefault(
- DoAll(SetArgReferee<0>(kDefaultBufferKey), Return(true)));
-
- ON_CALL(*GetVideoPlaneCollection(), GetVideoPlaneManipInfo())
- .WillByDefault(Return(std::vector<VideoPlaneManipulableInfo>(
- {kYComponentDestVMInfo, kUVComponentDestVMInfo})));
-
- ON_CALL(GetRenderableObjectFactory(), CreateRenderableObject(_, _))
- .WillByDefault(Return(mock_mixed_frame_));
-
- ON_CALL(GetVideoPlaneScaler(), GetScaleManipulator())
- .WillByDefault(Return(&GetScaler()));
-
- ON_CALL(GetScaler(), Do(_, _)).WillByDefault(Return(true));
-
- ON_CALL(*GetListener(), OnRenderingRelease(_)).WillByDefault(Return(true));
-
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kDefaultWidth, kDefaultHeight));
-
- renderer_ = std::unique_ptr<Renderer>(new Renderer(
- GetRenderableObjectFactory(),
- GetResolutionInfo(kDefaultWidth, kDefaultHeight, kDefaultFramerateNum,
- kDefaultFramerateDen),
- GetListener()));
-
- EXPECT_CALL(GetRenderableObject(), IsValid());
- ASSERT_TRUE(renderer_->IsValid());
- }
- virtual void TearDown() override {}
-
- protected:
- Renderer& GetRenderer() { return *renderer_; }
-
- MockRenderableObject& GetRenderableObject() { return *mock_mixed_frame_; }
- const MockVideoPlaneScaler& GetVideoPlaneScaler() const {
- return mock_vpscaler_;
- }
- const MockVideoPlaneManipulator& GetScaler() const { return scaler_; }
- const MockRenderableObjectFactory& GetRenderableObjectFactory() const {
- return mock_mixed_frame_factory_;
- }
- MockRendererEventListener* GetListener() { return &listener_; }
- const MockVideoPlaneCollection* GetVideoPlaneCollection() const {
- return &videoplanecollection_;
- }
-
- private:
- std::unique_ptr<Renderer> renderer_;
- MockVideoPlaneScaler mock_vpscaler_;
- MockVideoPlaneManipulator scaler_;
- MockRenderableObject* mock_mixed_frame_;
- MockRenderableObjectFactory mock_mixed_frame_factory_;
- MockRendererEventListener listener_;
- MockVideoPlaneCollection videoplanecollection_;
-};
-
-TEST_F(RendererTest, Start) {
- EXPECT_CALL(GetRenderableObject(), IsValid()).Times(AtLeast(1));
-
- EXPECT_TRUE(GetRenderer().Start());
-}
-
-TEST_F(RendererTest, Start_WithTwiceCall) {
- EXPECT_CALL(GetRenderableObject(), IsValid()).Times(AtLeast(1));
-
- EXPECT_TRUE(GetRenderer().Start());
- EXPECT_FALSE(GetRenderer().Start());
-}
-
-TEST_F(RendererTest, Stop) {
- EXPECT_CALL(GetRenderableObject(), IsValid()).Times(AtLeast(1));
-
- EXPECT_FALSE(GetRenderer().Stop());
-}
-
-TEST_F(RendererTest, Stop_AfterStart) {
- EXPECT_CALL(GetRenderableObject(), IsValid()).Times(AtLeast(1));
-
- EXPECT_TRUE(GetRenderer().Start());
- EXPECT_TRUE(GetRenderer().Stop());
-}
-
-TEST_F(RendererTest, ChangeResolution) {
- auto* new_frame = new MockRenderableObject();
- EXPECT_CALL(*new_frame, IsValid()).WillOnce(Return(true));
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kSmallWidth, kSmallHeight))
- .WillOnce(Return(new_frame));
-
- EXPECT_TRUE(GetRenderer().ChangeResolution(GetRenderableObjectFactory(),
- kSmallWidth, kSmallHeight));
-}
-
-TEST_F(RendererTest, ChangeResolution_WithInvalidResolution) {
- EXPECT_FALSE(GetRenderer().ChangeResolution(GetRenderableObjectFactory(),
- kInvalidWidth, kInvalidHeight));
- EXPECT_FALSE(GetRenderer().ChangeResolution(GetRenderableObjectFactory(),
- kSmallWidth, kInvalidHeight));
- EXPECT_FALSE(GetRenderer().ChangeResolution(GetRenderableObjectFactory(),
- kInvalidWidth, kSmallHeight));
-}
-
-TEST_F(RendererTest, ChangeResolution_WithSameResolution) {
- EXPECT_FALSE(GetRenderer().ChangeResolution(GetRenderableObjectFactory(),
- kDefaultWidth, kDefaultHeight));
-}
-
-TEST_F(RendererTest, ChangeResolution_WithReturnNullFrame) {
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kSmallWidth, kSmallHeight))
- .WillOnce(Return(nullptr));
-
- EXPECT_FALSE(GetRenderer().ChangeResolution(GetRenderableObjectFactory(),
- kSmallWidth, kSmallHeight));
-}
-
-TEST_F(RendererTest, ChangeResolution_WithInvalidNewFrame) {
- auto* new_frame = new MockRenderableObject();
- EXPECT_CALL(*new_frame, IsValid()).WillOnce(Return(false));
- EXPECT_CALL(GetRenderableObjectFactory(),
- CreateRenderableObject(kSmallWidth, kSmallHeight))
- .WillOnce(Return(new_frame));
-
- EXPECT_FALSE(GetRenderer().ChangeResolution(GetRenderableObjectFactory(),
- kSmallWidth, kSmallHeight));
-}
-
-TEST_F(RendererTest, ChangeRenderingSpeed) {
- EXPECT_CALL(GetRenderableObject(), IsValid()).Times(AtLeast(1));
-
- EXPECT_TRUE(
- GetRenderer().ChangeRenderingSpeed(kFastFramerateNum, kFastFramerateDen));
-}
-
-TEST_F(RendererTest, ChangeRenderingSpeed_WithInvalidFramerate) {
- EXPECT_FALSE(GetRenderer().ChangeRenderingSpeed(kInvalidFramerateNum,
- kInvalidFramerateDen));
- EXPECT_FALSE(GetRenderer().ChangeRenderingSpeed(kFastFramerateNum,
- kInvalidFramerateDen));
- EXPECT_FALSE(GetRenderer().ChangeRenderingSpeed(kInvalidFramerateNum,
- kFastFramerateDen));
-}
-
-TEST_F(RendererTest, Render) {
- EXPECT_CALL(
- GetRenderableObject(),
- Render(
- Eq(&GetScaler()),
- AllOf(SizeIs(2),
- ElementsAre(
- IsSameVideoPlaneManipulableInfo(kYComponentDestVMInfo),
- IsSameVideoPlaneManipulableInfo(kUVComponentDestVMInfo))),
- AllOf(Field(&Geometry::x, Eq(kDefaultX)),
- Field(&Geometry::y, Eq(kDefaultY)),
- Field(&Geometry::w, Eq(kDefaultW)),
- Field(&Geometry::h, Eq(kDefaultH)))))
- .Times(1);
- EXPECT_CALL(*GetVideoPlaneCollection(), GetVideoPlaneManipInfo()).Times(1);
- EXPECT_CALL(GetRenderableObject(), IsValid()).Times(AtLeast(1));
- EXPECT_CALL(GetVideoPlaneScaler(), GetScaleManipulator()).Times(1);
-
- EXPECT_TRUE(GetRenderer().Render(
- &GetVideoPlaneScaler(), GetVideoPlaneCollection(),
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-TEST_F(RendererTest, Render_WithNullCollection) {
- EXPECT_FALSE(GetRenderer().Render(
- &GetVideoPlaneScaler(), nullptr,
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
-
-TEST_F(RendererTest, Render_WithNullScaler) {
- EXPECT_CALL(GetRenderableObject(), Render(_, _, _)).Times(0);
-
- EXPECT_FALSE(GetRenderer().Render(
- nullptr, GetVideoPlaneCollection(),
- GetGeometry(kDefaultX, kDefaultY, kDefaultW, kDefaultH)));
-}
\ No newline at end of file
+++ /dev/null
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include "mixer/constant.h"
-#include "mixer/mock/mock_bufferobject.h"
-#include "mixer/tizen/tizenbuffermgr.h"
-
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::Field;
-using ::testing::NotNull;
-using ::testing::Return;
-
-namespace {
-using namespace plusplayer;
-struct MockTBM {
- public:
- class Fake {
- public:
- MOCK_METHOD3(BoAlloc, BufferDefaultType(tbm_bufmgr, int, int));
- MOCK_METHOD1(BoUnRef, void(BufferDefaultType));
- MOCK_METHOD2(BoImport, BufferDefaultType(tbm_bufmgr, BufferKeyType));
- MOCK_METHOD2(GACopy, int(tbm_bufmgr, GraphicsGABltRopInfo*));
- MOCK_METHOD2(GAScale, int(tbm_bufmgr, GraphicsGAScaleInfo*));
- MOCK_METHOD2(GAFill, int(tbm_bufmgr, GraphicsGAFillRectInfo*));
- };
-
- static Fake* instance;
-
- static void BoUnRef(BufferDefaultType bo) { instance->BoUnRef(bo); }
-
- static BufferDefaultType BoAlloc(tbm_bufmgr bufmgr, int size, int flag) {
- return instance->BoAlloc(bufmgr, size, flag);
- }
- static BufferDefaultType BoImport(tbm_bufmgr bufmgr, BufferKeyType key) {
- return instance->BoImport(bufmgr, key);
- }
-
- static int GAScale(tbm_bufmgr bufmgr, GraphicsGAScaleInfo* info) {
- return instance->GAScale(bufmgr, info);
- }
-
- static int GACopy(tbm_bufmgr bufmgr, GraphicsGABltRopInfo* info) {
- return instance->GACopy(bufmgr, info);
- }
-
- static int GAFill(tbm_bufmgr bufmgr, GraphicsGAFillRectInfo* info) {
- return instance->GAFill(bufmgr, info);
- }
-};
-
-MockTBM::Fake* MockTBM::instance = nullptr;
-} // namespace
-
-namespace plusplayer_ut {
-
-using TizenBufferManager = BufferManagerWithType<MockTBM>;
-
-class TizenBufferManagerTest : public ::testing::Test {
- public:
- virtual void SetUp() override {
- MockTBM::instance = &GetTBM();
-
- ON_CALL(GetTBM(), BoAlloc(_, _, _)).WillByDefault(Return(kDefaultBuffer));
- ON_CALL(GetTBM(), BoImport(_, _)).WillByDefault(Return(kDefaultBuffer));
- }
- virtual void TearDown() override {}
-
- protected:
- MockTBM::Fake& GetTBM() { return fake_tbm_; }
- TizenBufferManager& GetBufferManager() { return bufmgr_; }
-
- private:
- MockTBM::Fake fake_tbm_;
- TizenBufferManager bufmgr_;
-};
-
-TEST_F(TizenBufferManagerTest, IsValid) {
- EXPECT_TRUE(GetBufferManager().IsValid());
-}
-
-TEST_F(TizenBufferManagerTest, Allocate) {
- EXPECT_CALL(GetTBM(), BoAlloc(NotNull(), kExpectedDefaultByteSize,
- TBM_BO_SCANOUT | (1 << 17)));
- EXPECT_CALL(GetTBM(), BoUnRef(NotNull()));
-
- auto* bufferobj = GetBufferManager().Allocate(kExpectedDefaultByteSize);
- EXPECT_NE(nullptr, bufferobj);
- if (bufferobj) delete bufferobj;
-}
-
-TEST_F(TizenBufferManagerTest, Allocate_WithNullBO) {
- EXPECT_CALL(GetTBM(), BoAlloc(NotNull(), kExpectedDefaultByteSize,
- TBM_BO_SCANOUT | (1 << 17)))
- .WillOnce(Return(nullptr));
-
- EXPECT_EQ(nullptr, GetBufferManager().Allocate(kExpectedDefaultByteSize));
-}
-
-TEST_F(TizenBufferManagerTest, Allocate_WithInvalidBufferSize) {
- EXPECT_EQ(nullptr, GetBufferManager().Allocate(kInvalidBufferSize));
-}
-
-TEST_F(TizenBufferManagerTest, Import) {
- EXPECT_CALL(GetTBM(), BoImport(NotNull(), _));
- EXPECT_CALL(GetTBM(), BoUnRef(NotNull()));
-
- EXPECT_NE(nullptr, GetBufferManager().Import(kDefaultBufferHandle));
-}
-
-TEST_F(TizenBufferManagerTest, Import_WithNullBO) {
- EXPECT_CALL(GetTBM(), BoImport(NotNull(), _)).WillOnce(Return(nullptr));
-
- EXPECT_EQ(nullptr, GetBufferManager().Import(kDefaultBufferHandle));
-}
-
-TEST_F(TizenBufferManagerTest, GetScaleManipulator) {
- EXPECT_NE(nullptr, GetBufferManager().GetScaleManipulator());
-}
-
-class TizenBufferManagerScalerTest : public ::testing::Test {
- public:
- virtual void SetUp() override {
- MockTBM::instance = &GetTBM();
- ON_CALL(GetTBM(), GAScale(_, _)).WillByDefault(Return(true));
- }
- virtual void TearDown() override {}
-
- protected:
- MockTBM::Fake& GetTBM() { return fake_tbm_; }
- const VideoPlaneManipulator& GetScaler() {
- return *bufmgr_.GetScaleManipulator();
- }
-
- private:
- MockTBM::Fake fake_tbm_;
- TizenBufferManager bufmgr_;
-};
-
-TEST_F(TizenBufferManagerScalerTest, Do) {
- EXPECT_CALL(
- GetTBM(),
- GAScale(
- NotNull(),
- AllOf(
- Field(&GraphicsGAScaleInfo::ga_mode, GRAPHICS_GA_SCALE_MODE),
- Field(&GraphicsGAScaleInfo::rop_mode, GRAPHICS_GA_ROP_COPY),
- Field(&GraphicsGAScaleInfo::ga_op_type, GRAPHICS_GA_SCALE),
- Field(&GraphicsGAScaleInfo::pre_alphamode, 0),
- Field(&GraphicsGAScaleInfo::ca_value, 0),
- Field(&GraphicsGAScaleInfo::rop_on_off, 0),
- Field(&GraphicsGAScaleInfo::src_handle,
- kYComponentSrcVMInfo.handle),
- Field(&GraphicsGAScaleInfo::src_hbytesize,
- kYComponentSrcVMInfo.linesize),
- Field(
- &GraphicsGAScaleInfo::src_rect,
- AllOf(
- Field(&GraphicsRectInfo::x, kYComponentSrcVMInfo.rect.x),
- Field(&GraphicsRectInfo::y, kYComponentSrcVMInfo.rect.y),
- Field(&GraphicsRectInfo::w, kYComponentSrcVMInfo.rect.w),
- Field(&GraphicsRectInfo::h,
- kYComponentSrcVMInfo.rect.h))),
- Field(&GraphicsGAScaleInfo::dst_handle,
- kYComponentDestVMInfo.handle),
- Field(&GraphicsGAScaleInfo::dst_hbytesize,
- kYComponentDestVMInfo.linesize),
- Field(
- &GraphicsGAScaleInfo::dst_rect,
- AllOf(
- Field(&GraphicsRectInfo::x, kYComponentDestVMInfo.rect.x),
- Field(&GraphicsRectInfo::y, kYComponentDestVMInfo.rect.y),
- Field(&GraphicsRectInfo::w, kYComponentDestVMInfo.rect.w),
- Field(&GraphicsRectInfo::h,
- kYComponentDestVMInfo.rect.h))))));
-
- EXPECT_TRUE(GetScaler().Do(kYComponentSrcVMInfo, kYComponentDestVMInfo));
-}
-
-TEST_F(TizenBufferManagerScalerTest, Do_WithDifferentComponent) {
- EXPECT_FALSE(GetScaler().Do(kYComponentSrcVMInfo, kUVComponentDestVMInfo));
-}
-} // namespace plusplayer_ut
+++ /dev/null
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include <iostream>
-
-#include "mixer/constant.h"
-#include "mixer/tizen/tizenbufferobj.h"
-
-using ::testing::_;
-using ::testing::Return;
-
-namespace {
-using namespace plusplayer;
-
-struct MockTBM {
- public:
- class Fake {
- public:
- MOCK_METHOD1(BoRef, BufferDefaultType(BufferDefaultType));
- MOCK_METHOD1(BoUnRef, void(BufferDefaultType));
- MOCK_METHOD1(BoSize, int(BufferDefaultType));
- MOCK_METHOD2(BoGetHandle, BufferUnionHandleType(BufferDefaultType, int));
- MOCK_METHOD1(BoExport, BufferKeyType(BufferDefaultType));
- };
-
- static Fake* instance;
-
- static BufferDefaultType BoRef(BufferDefaultType bo) {
- return instance->BoRef(bo);
- }
-
- static void BoUnRef(BufferDefaultType bo) { instance->BoUnRef(bo); }
-
- static int BoSize(BufferDefaultType bo) { return instance->BoSize(bo); }
-
- static BufferUnionHandleType BoGetHandle(BufferDefaultType bo, int device) {
- return instance->BoGetHandle(bo, device);
- }
- static BufferKeyType BoExport(BufferDefaultType bo) {
- return instance->BoExport(bo);
- }
-};
-
-MockTBM::Fake* MockTBM::instance = nullptr;
-} // namespace
-
-namespace plusplayer_ut {
-
-using TizenBufferObject = BufferObjectWithType<MockTBM>;
-
-class InvalidBufferObjectWithTypeTest : public ::testing::Test {
- public:
- explicit InvalidBufferObjectWithTypeTest() : bufferobj_(nullptr) {}
- virtual ~InvalidBufferObjectWithTypeTest() = default;
- virtual void SetUp() override {}
- virtual void TearDown() override {}
-
- protected:
- TizenBufferObject& GetBufferObject() { return bufferobj_; }
-
- private:
- TizenBufferObject bufferobj_;
-};
-
-TEST_F(InvalidBufferObjectWithTypeTest, IsValid) {
- EXPECT_FALSE(GetBufferObject().IsValid());
-}
-
-TEST_F(InvalidBufferObjectWithTypeTest, GetBufferHandle) {
- EXPECT_EQ(plusplayer::kInvalidBufferHandle,
- GetBufferObject().GetBufferHandle());
-}
-
-TEST_F(InvalidBufferObjectWithTypeTest, Export) {
- EXPECT_EQ(plusplayer::kInvalidBufferKey, GetBufferObject().Export());
-}
-
-TEST_F(InvalidBufferObjectWithTypeTest, GetSize) {
- EXPECT_EQ(plusplayer::kInvalidBufferSize, GetBufferObject().GetSize());
-}
-
-class BufferObjectWithTypeTest : public ::testing::Test {
- public:
- virtual void SetUp() override {
- MockTBM::instance = &GetTBM();
-
- ON_CALL(GetTBM(), BoRef(_)).WillByDefault(Return(kDefaultBuffer));
- ON_CALL(GetTBM(), BoSize(_))
- .WillByDefault(Return(kExpectedDefaultByteSize));
- ON_CALL(GetTBM(), BoGetHandle(_, _))
- .WillByDefault(Return(kDefaultMappedHandle));
- ON_CALL(GetTBM(), BoExport(_)).WillByDefault(Return(kDefaultBufferKey));
-
- EXPECT_CALL(GetTBM(), BoRef(_)).Times(1);
- EXPECT_CALL(GetTBM(), BoUnRef(_)).Times(1);
-
- bufferobj_ = std::unique_ptr<TizenBufferObject>(
- new TizenBufferObject(kDefaultBuffer));
- }
- virtual void TearDown() override {}
-
- protected:
- MockTBM::Fake& GetTBM() { return fake_tbm_; }
- TizenBufferObject& GetBufferObject() { return *bufferobj_; }
-
- private:
- MockTBM::Fake fake_tbm_;
- std::unique_ptr<TizenBufferObject> bufferobj_;
-};
-
-TEST_F(BufferObjectWithTypeTest, IsValid) {
- EXPECT_TRUE(GetBufferObject().IsValid());
-}
-
-TEST_F(BufferObjectWithTypeTest, GetBufferHandle) {
- EXPECT_CALL(GetTBM(), BoGetHandle(_, _)).Times(1);
- EXPECT_EQ(kDefaultBufferHandle, GetBufferObject().GetBufferHandle());
-}
-
-TEST_F(BufferObjectWithTypeTest, Export) {
- EXPECT_CALL(GetTBM(), BoExport(_)).Times(1);
- EXPECT_EQ(kDefaultBufferKey, GetBufferObject().Export());
-}
-
-TEST_F(BufferObjectWithTypeTest, GetSize) {
- EXPECT_CALL(GetTBM(), BoSize(_)).Times(1);
- EXPECT_EQ(kExpectedDefaultByteSize, GetBufferObject().GetSize());
-}
-} // namespace plusplayer_ut
\ No newline at end of file
+++ /dev/null
-#include <gmock/gmock.h>
-#include <gtest/gtest.h>
-
-#include <memory>
-
-#include "mixer/constant.h"
-#include "mixer/matcher.h"
-#include "mixer/mock/mock_bufferobject.h"
-#include "mixer/mock/movable.h"
-#include "mixer/mock/moveobj_wrapper.h"
-#include "mixer/videoplane.h"
-
-using ::testing::AllOf;
-using ::testing::AnyNumber;
-using ::testing::Field;
-using ::testing::Return;
-
-namespace plusplayer_ut {
-
-template <typename PlaneType>
-class DefaultVideoPlaneOptionWithBufferObject {
- public:
- using BufferObjectPtr = typename PlaneType::BufferObjectPtr;
- virtual ~DefaultVideoPlaneOptionWithBufferObject() = default;
-
- protected:
- virtual void Init_() {
- ON_CALL(GetBufferObject(), GetBufferHandle())
- .WillByDefault(Return(kDefaultBufferHandle));
- ON_CALL(GetBufferObject(), Export())
- .WillByDefault(Return(kDefaultBufferKey));
- ON_CALL(GetBufferObject(), GetSize())
- .WillByDefault(Return(kDefaultWidth * kDefaultHeight));
-
- EXPECT_CALL(GetBufferObject(), GetBufferHandle()).Times(AnyNumber());
- EXPECT_CALL(GetBufferObject(), GetSize()).Times(AnyNumber());
-
- ASSERT_TRUE(y_plane_->IsValid());
- }
-
- protected:
- PlaneType& GetPlane() { return *y_plane_.get(); }
- MockBufferObject& GetBufferObject() { return bufferobj_.Get(); }
- MockBufferObject* MoveBufferObject() { return bufferobj_.Move(); }
-
- private:
- MoveObjectWrapper<MockBufferObject> bufferobj_{new MockBufferObject()};
- std::unique_ptr<PlaneType> y_plane_{new PlaneType(
- BufferObjectPtr(MoveBufferObject()), kDefaultWidth, kDefaultHeight)};
-};
-
-class YComponentVideoPlaneTest
- : public ::testing::Test,
- public DefaultVideoPlaneOptionWithBufferObject<YComponentVideoPlane> {
- public:
- virtual void SetUp() override { Init_(); }
- virtual void TearDown() override {}
-};
-
-TEST_F(YComponentVideoPlaneTest, GetVideoPlaneManipulableInfo) {
- EXPECT_THAT(
- GetPlane().GetVideoPlaneManipulableInfo(),
- AllOf(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kYComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(
- GetGeometry(0, 0, kDefaultWidth, kDefaultHeight)))));
-}
-
-TEST_F(YComponentVideoPlaneTest, GetVideoPlaneManipulableInfo_AfterCrop) {
- GetPlane().SetCropArea(GetCropArea(0.1, 0.1, 0.9, 0.9));
-
- EXPECT_THAT(
- GetPlane().GetVideoPlaneManipulableInfo(),
- AllOf(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kYComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(GetGeometry(
- kDefaultWidth * 0.1, kDefaultHeight * 0.1,
- kDefaultWidth * 0.9, kDefaultHeight * 0.9)))));
-}
-
-class UVComponentVideoPlaneTest
- : public ::testing::Test,
- public DefaultVideoPlaneOptionWithBufferObject<UVComponentVideoPlane> {
- public:
- virtual void SetUp() override {
- Init_();
- ON_CALL(GetBufferObject(), GetSize())
- .WillByDefault(Return(kDefaultWidth * kDefaultHeight / 2));
- }
- virtual void TearDown() override {}
-};
-
-TEST_F(UVComponentVideoPlaneTest, GetVideoPlaneManipulableInfo) {
- EXPECT_THAT(
- GetPlane().GetVideoPlaneManipulableInfo(),
- AllOf(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kUVComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(GetGeometry(0, 0, kDefaultWidth / 2,
- kDefaultHeight / 2)))));
-}
-
-TEST_F(UVComponentVideoPlaneTest, GetVideoPlaneManipulableInfo_AfterCrop) {
- GetPlane().SetCropArea(GetCropArea(0.1, 0.1, 0.9, 0.9));
-
- EXPECT_THAT(
- GetPlane().GetVideoPlaneManipulableInfo(),
- AllOf(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kUVComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(GetGeometry(
- kDefaultWidth / 2 * 0.1, kDefaultHeight / 2 * 0.1,
- kDefaultWidth / 2 * 0.9, kDefaultHeight / 2 * 0.9)))));
-}
-
-class YUVComponentVideoPlaneTest : public ::testing::Test {
- public:
- virtual void SetUp() override {
- ON_CALL(GetBufferObject(), GetBufferHandle())
- .WillByDefault(Return(kDefaultBufferHandle));
- ON_CALL(GetBufferObject(), Export())
- .WillByDefault(Return(kDefaultBufferKey));
- ON_CALL(GetBufferObject(), GetSize())
- .WillByDefault(Return(kDefaultWidth * kDefaultHeight * 1.5));
-
- EXPECT_CALL(GetBufferObject(), GetBufferHandle()).Times(AnyNumber());
- EXPECT_CALL(GetBufferObject(), GetSize()).Times(AnyNumber());
-
- ASSERT_TRUE(GetYPlane().IsValid());
- ASSERT_TRUE(GetUVPlane().IsValid());
- }
- virtual void TearDown() override {}
-
- protected:
- YComponentVideoPlaneWithSharedMemory& GetYPlane() { return *y_plane_.get(); }
- UVComponentVideoPlaneWithSharedMemory& GetUVPlane() {
- return *uv_plane_.get();
- }
- MockBufferObject& GetBufferObject() {
- return dynamic_cast<MockBufferObject&>(*bufferobj_.get());
- }
-
- private:
- std::shared_ptr<BufferObject> bufferobj_{new MockBufferObject()};
- std::unique_ptr<YComponentVideoPlaneWithSharedMemory> y_plane_{
- new YComponentVideoPlaneWithSharedMemory(bufferobj_, kDefaultWidth,
- kDefaultHeight)};
- std::unique_ptr<UVComponentVideoPlaneWithSharedMemory> uv_plane_{
- new UVComponentVideoPlaneWithSharedMemory(bufferobj_, kDefaultWidth,
- kDefaultHeight)};
-};
-
-TEST_F(YUVComponentVideoPlaneTest, GetVideoPlaneManipulableInfo) {
- EXPECT_THAT(
- GetYPlane().GetVideoPlaneManipulableInfo(),
- AllOf(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kYComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(
- GetGeometry(0, 0, kDefaultWidth, kDefaultHeight)))));
- EXPECT_THAT(
- GetUVPlane().GetVideoPlaneManipulableInfo(),
- AllOf(
- Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kUVComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(GetGeometry(0, kDefaultHeight, kDefaultWidth / 2,
- kDefaultHeight / 2)))));
-}
-
-TEST_F(YUVComponentVideoPlaneTest, GetVideoPlaneManipulableInfo_AfterCrop) {
- GetYPlane().SetCropArea(GetCropArea(0.1, 0.1, 0.9, 0.9));
- GetUVPlane().SetCropArea(GetCropArea(0.1, 0.1, 0.9, 0.9));
-
- EXPECT_THAT(
- GetYPlane().GetVideoPlaneManipulableInfo(),
- AllOf(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kYComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(GetGeometry(
- kDefaultWidth * 0.1, kDefaultHeight * 0.1,
- kDefaultWidth * 0.9, kDefaultHeight * 0.9)))));
- EXPECT_THAT(
- GetUVPlane().GetVideoPlaneManipulableInfo(),
- AllOf(Field(&VideoPlaneManipulableInfo::component,
- PlaneComponent::kUVComponent),
- Field(&VideoPlaneManipulableInfo::handle, kDefaultBufferHandle),
- Field(&VideoPlaneManipulableInfo::linesize, kDefaultWidth),
- Field(&VideoPlaneManipulableInfo::rect,
- IsSameGeometry(GetGeometry(
- kDefaultWidth / 2 * 0.1,
- kDefaultHeight / 2 * 0.1 + kDefaultHeight,
- kDefaultWidth / 2 * 0.9, kDefaultHeight / 2 * 0.9)))));
-}
-
-} // namespace plusplayer_ut
\ No newline at end of file
+++ /dev/null
-
-#include <unistd.h>
-#include <iostream> // for standard I/O
-#include <string> // for strings
-#include <iomanip> // for controlling float print precision
-#include <sstream> // string to number conversion
-
-#include <opencv2/core/core.hpp> // Basic OpenCV structures (cv::Mat, Scalar)
-#include <opencv2/imgproc/imgproc.hpp> // Gaussian Blur
-#include <opencv2/highgui/highgui.hpp> // OpenCV window I/O
-
-#include "ut/include/plusplayer/imagesimilarity.h"
-
-using namespace std;
-using namespace cv;
-
-
-double getPSNR(const Mat& I1, const Mat& I2)
-{
- Mat s1;
- absdiff(I1, I2, s1); // |I1 - I2|
- s1.convertTo(s1, CV_32F); // cannot make a square on 8 bits
- s1 = s1.mul(s1); // |I1 - I2|^2
-
- Scalar s = sum(s1); // sum elements per channel
-
- double sse = s.val[0] + s.val[1] + s.val[2]; // sum channels
-
- if( sse <= 1e-10) { // for small values return zero
- return 0;
- }
- else {
- double mse = sse / (double)(I1.channels() * I1.total());
- double psnr = 10.0 * log10((255 * 255) / mse);
- return psnr;
- }
-}
-
-Scalar getMSSIM( const Mat& i1, const Mat& i2)
-{
- const double C1 = 6.5025, C2 = 58.5225;
-
- int d = CV_32F;
-
- Mat I1, I2;
- i1.convertTo(I1, d); // cannot calculate on one byte large values
- i2.convertTo(I2, d);
-
- Mat I2_2 = I2.mul(I2); // I2^2
- Mat I1_2 = I1.mul(I1); // I1^2
- Mat I1_I2 = I1.mul(I2); // I1 * I2
-
-
- Mat mu1, mu2; // PRELIMINARY COMPUTING
- GaussianBlur(I1, mu1, Size(11, 11), 1.5);
- GaussianBlur(I2, mu2, Size(11, 11), 1.5);
-
- Mat mu1_2 = mu1.mul(mu1);
- Mat mu2_2 = mu2.mul(mu2);
- Mat mu1_mu2 = mu1.mul(mu2);
-
- Mat sigma1_2, sigma2_2, sigma12;
-
- GaussianBlur(I1_2, sigma1_2, Size(11, 11), 1.5);
- sigma1_2 -= mu1_2;
-
- GaussianBlur(I2_2, sigma2_2, Size(11, 11), 1.5);
- sigma2_2 -= mu2_2;
-
- GaussianBlur(I1_I2, sigma12, Size(11, 11), 1.5);
- sigma12 -= mu1_mu2;
-
- ///////////////////////////////// FORMULA ////////////////////////////////
- Mat t1, t2, t3;
-
- t1 = 2 * mu1_mu2 + C1;
- t2 = 2 * sigma12 + C2;
- t3 = t1.mul(t2); // t3 = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))
-
- t1 = mu1_2 + mu2_2 + C1;
- t2 = sigma1_2 + sigma2_2 + C2;
- t1 = t1.mul(t2); // t1 =((mu1_2 + mu2_2 + C1).*(sigma1_2 + sigma2_2 + C2))
-
- Mat ssim_map;
- divide(t3, t1, ssim_map); // ssim_map = t3./t1;
-
- Scalar mssim = mean(ssim_map); // mssim = average of ssim map
- return mssim;
-}
-
-double ImageSimilarity::CompareImagesWithPSNR(char *reference_image, char *comparison_image)
-{
- const string sourceReference(reference_image);
- const string sourceCompareWith(comparison_image);
-
- Mat frameReference = imread(sourceReference);
- Mat frameUnderTest = imread(sourceCompareWith);
-
- if (frameReference.cols != frameUnderTest.cols || frameReference.rows != frameUnderTest.rows) {
- return -1;
- }
-
- double PSNR_Value = getPSNR(frameReference,frameUnderTest);
- return PSNR_Value;
-}
-
-double ImageSimilarity::CompareImagesWithMSSIM(char *reference_image, char *comparison_image)
-{
- const string sourceReference(reference_image);
- const string sourceCompareWith(comparison_image);
-
- Mat frameReference = frameReference = imread(sourceReference);
- Mat frameUnderTest = frameUnderTest = imread(sourceCompareWith);
-
- if (frameReference.cols != frameUnderTest.cols || frameReference.rows != frameUnderTest.rows) {
- return -1;
- }
-
- Scalar mssimV = getMSSIM(frameReference, frameUnderTest);
-
- double normalized_mean_SSIM = (mssimV.val[2] + mssimV.val[1] + mssimV.val[0])*100/3;
- return normalized_mean_SSIM;
-}
\ No newline at end of file
#include <math.h>
#include <fstream>
-#include <jconfig.h>
-#include <jpeglib.h>
-#include "ivideocapture.hpp"
-#include "capi-video-capture.h"
-#include "iaudio-control.hpp"
-#include "diagnosis-audio-control.hpp"
+//#include <jconfig.h>
+//#include <jpeglib.h>
using namespace plusplayer;
Utility::Utility() {
appwindow_.reset(new plusplayer_ut::AppWindow(0, 0, 1920, 1080));
- audioControl = IAudioControl::getInstance();
- audioDiagnoser = DiagnosisAudioControl::getInstance();
}
Utility::~Utility() {}
return ::testing::UnitTest::GetInstance()->current_test_info()->name();
}
-#ifndef IS_AUDIO_PRODUCT
-
-#if 0
-plusplayer::PlusPlayer::Ptr Utility::GetOpenedMixPlusPlayer(std::string& uri,
- Mixer* mixer,
- Geometry& roi) {
- auto player = plusplayer::PlusPlayer::Create();
- EXPECT_TRUE(player->Open(uri.c_str()));
- EXPECT_TRUE(player->SetDisplay(DisplayType::kMixer, mixer));
- EXPECT_TRUE(player->SetDisplayRoi(roi));
- return player;
-}
-
-plusplayer::PlusPlayer::Ptr Utility::GetPreparedMixPlusPlayer(std::string& uri,
- Mixer* mixer,
- Geometry& roi) {
- auto player = this->GetOpenedMixPlusPlayer(uri, mixer, roi);
- EXPECT_TRUE(player->Prepare());
- return player;
-}
-
-plusplayer::PlusPlayer::Ptr Utility::GetStartedMixPlusPlayer(std::string& uri,
- Mixer* mixer,
- Geometry& roi) {
- auto player = this->GetPreparedMixPlusPlayer(uri, mixer, roi);
- EXPECT_TRUE(player->Start());
- return player;
-}
-#endif
-
-esplusplayer_handle Utility::GetOpenedMixESPP(mixer_handle mixer,
- Geometry& roi) {
- esplusplayer_handle player = esplusplayer_create();
- EXPECT_EQ(esplusplayer_open(player), ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(
- esplusplayer_set_display(player, ESPLUSPLAYER_DISPLAY_TYPE_MIXER, mixer),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- EXPECT_EQ(esplusplayer_set_display_roi(player, roi.x, roi.y, roi.w, roi.h),
- ESPLUSPLAYER_ERROR_TYPE_NONE);
- return player;
-}
-
-esplusplayer_handle Utility::GetPreparedMixESPP(std::string& uri,
- mixer_handle mixer,
- Geometry& roi) {
- esplusplayer_handle player = this->GetOpenedMixESPP(mixer, roi);
-
- if (!PrepareESPP(player, uri)) return nullptr;
- return player;
-}
-
-esplusplayer_handle Utility::GetStartedMixESPP(std::string& uri,
- mixer_handle mixer,
- Geometry& roi) {
- esplusplayer_handle player = this->GetPreparedMixESPP(uri, mixer, roi);
-
- if (esplusplayer_start(player) == ESPLUSPLAYER_ERROR_TYPE_NONE)
- return player;
- else
- printf("esplusplayer_start failed\n");
- return nullptr;
-}
-#endif
esplusplayer_handle Utility::GetOpenedESPP(Geometry& roi) {
esplusplayer_handle player = esplusplayer_create();
evas_h Utility::GetWindow() const { return appwindow_->GetWindow().obj; }
-unsigned int Gcd(unsigned int u, unsigned int v) {
- int shift = 0;
-
- /* GCD(0,v) == v; GCD(u,0) == u, GCD(0,0) == 0 */
-
- if (u == 0) {
- return v;
- }
- if (v == 0) {
- return u;
- }
-
- /* Let shift := lg K, where K is the greatest power of 2
- dividing both u and v. */
- for (shift = 0; ((u | v) & 1) == 0; ++shift) {
- u >>= 1;
- v >>= 1;
- }
-
- while ((u & 1) == 0) {
- u >>= 1;
- }
-
- /* From here on, u is always odd. */
- do {
- /* remove all factors of 2 in v -- they are not common */
- /* note: v is not zero, so while will terminate */
- while ((v & 1) == 0) {
- v >>= 1;
- /* Loop X */
- }
- /* Now u and v are both odd. Swap if necessary so u <= v,
- then set v = v - u (which is even). For bignums, the
- swapping is just pointer movement, and the subtraction
- can be done in-place. */
- if (u > v) {
- unsigned int t = v;
- v = u;
- u = t;
- } // Swap u and v.
- v = v - u; // Here v >= u.
- } while (v != 0);
-
- /* restore common factors of 2 */
- return u << shift;
-}
-
-void ResizeCopy(unsigned int m_width, unsigned int m_height,
- unsigned int m_rwidth, unsigned int m_rheight,
- char* c_ptr, char* y_ptr, unsigned char* dest,
- unsigned int color_format) {
- unsigned int omit = 1;
- unsigned int x = 0;
- unsigned int y = 0;
- unsigned char resize = 1;
-
- if (m_width == m_rwidth) {
- resize = 0;
- } else {
- omit = Gcd(m_width, m_rwidth);
- omit = m_width / omit;
- }
- printf("m_width %u, m_rwidth %u, omit %u\n", m_width, m_rwidth, omit);
-
- // long int inc = 3 * m_rwidth * m_rheight;
- long int inc = 0;
-
- for (y = 0; y < m_height; y++) {
- if ((y + 1) % omit || !resize) {
- for (x = 0; x < m_width; x += sizeof(unsigned int)) {
-
- unsigned int Yplain =
- *((unsigned int*)((void*)(y_ptr + y * m_width + x)));
- unsigned int Cplain =
- *((unsigned int*)((void*)(c_ptr + y * m_width + x)));
-
- switch (color_format) {
- case SECVIDEO_CAPTURE_COLOR_YUV444: // 444
- break;
- case SECVIDEO_CAPTURE_COLOR_YUV422: // 422
- Cplain = *((unsigned int*)((void*)(c_ptr + y * m_width + x)));
- break;
- case SECVIDEO_CAPTURE_COLOR_YUV420: // 420
- Cplain = *((unsigned int*)((void*)(c_ptr + (y / 2) * m_width + x)));
- break;
- default:
- break;
- }
- if ((x + 4) % omit || !resize) {
- dest[inc++] = (Yplain) & 0xFF;
- dest[inc++] = Cplain & 0xFF;
- dest[inc++] = (Cplain >> 8) & 0xFF;
- }
- if ((x + 3) % omit || !resize) {
- dest[inc++] = (Yplain >> 8) & 0xFF;
- dest[inc++] = (Cplain) & 0xFF;
- dest[inc++] = (Cplain >> 8) & 0xFF;
- }
-
- if ((x + 2) % omit || !resize) {
- dest[inc++] = (Yplain >> 16) & 0xFF;
- dest[inc++] = (Cplain >> 16) & 0xFF;
- dest[inc++] = (Cplain >> 24) & 0xFF;
- }
-
- if ((x + 1) % omit || !resize) {
- dest[inc++] = (Yplain >> 24) & 0xFF;
- dest[inc++] = (Cplain >> 16) & 0xFF;
- dest[inc++] = (Cplain >> 24) & 0xFF;
- }
- }
- }
- }
-}
-
-int Utility::CaptureYUV(int capture_width, int capture_height,
- char* ybuff, char* cbuff, int ysize,
- int csize, std::string result_file_path) {
- // screen capture
- IVideoCapture* VCObjptr = IVideoCapture::getInstance();
-
- IVideoCapture::InputParams input_params;
-
- input_params.capture_w = capture_width;
- input_params.capture_h = capture_height;
-
- IVideoCapture::OutputParams output_params;
- output_params.p_y_addr = ybuff;
- output_params.p_c_addr = cbuff;
- output_params.size_y = ysize;
- output_params.size_c = csize;
-
- sleep(1);
-
- VCObjptr->getVideoPostYUV(input_params, output_params);
-
- // write
- FILE* fexpect = NULL;
-
- while (output_params.p_y_addr) {
- fexpect = fopen(result_file_path.c_str(), "wb");
- if (fexpect == NULL) {
- LOGE("can't open the file");
- break;
- }
- fwrite(output_params.p_y_addr, 1, ysize, fexpect);
- fclose(fexpect);
- fexpect = NULL;
- output_params.p_y_addr = NULL;
- }
-
- return 0;
-}
-///TODO:: Modify the API to return the pointer instead of writing it as an image file.
-int Utility::CaptureJPG(const int capture_width, const int capture_height,
- char* ybuff, char* cbuff, const int ysize,
- const int csize, std::string img_file_path) {
- IVideoCapture* VCObjptr = IVideoCapture::getInstance();
- int output_color_format = 0;
-
- IVideoCapture::InputParams input_params;
- input_params.capture_w = capture_width;
- input_params.capture_h = capture_height;
-
- IVideoCapture::OutputParams output_params;
- output_params.p_y_addr = ybuff;
- output_params.p_c_addr = cbuff;
- output_params.size_y = ysize;
- output_params.size_c = csize;
-
- sleep(1);
-
- VCObjptr->getVideoPostYUV(input_params, output_params);
- output_color_format = static_cast<int>(output_params.color_format);
-
- sleep(1);
-
- unsigned char* rawImage;
- rawImage = (unsigned char*)malloc(sizeof(unsigned char) * 3 * capture_width *
- capture_height);
-
- ResizeCopy(capture_width, capture_height, capture_width, capture_height,
- cbuff, ybuff, rawImage, output_color_format);
-
- struct jpeg_compress_struct cinfo;
- struct jpeg_error_mgr jerr;
- FILE* outfile = NULL; /* target file */
-
- JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */
- int row_stride; /* physical row width in image buffer */
-
- cinfo.err = jpeg_std_error(&jerr);
- jpeg_create_compress(&cinfo);
-
- outfile = fopen(img_file_path.c_str(), "wb");
- if (outfile == NULL) {
- LOGE("can't open the file");
- if (rawImage != NULL) free(rawImage);
- return -1;
- }
- jpeg_stdio_dest(&cinfo, outfile);
-
- cinfo.image_width = capture_width;
- cinfo.image_height = capture_height;
- cinfo.input_components = 3; /* # of color components per pixel */
- cinfo.in_color_space = JCS_YCbCr;
- jpeg_set_defaults(&cinfo);
- jpeg_set_quality(&cinfo, 70, TRUE);
- jpeg_start_compress(&cinfo, TRUE);
-
- row_stride = capture_width * 3; /* JSAMPLEs per row in image_buffer */
-
- while (cinfo.next_scanline < cinfo.image_height) {
- row_pointer[0] = &((rawImage)[cinfo.next_scanline * row_stride]);
- (void)jpeg_write_scanlines(&cinfo, row_pointer, 1);
- }
-
- jpeg_finish_compress(&cinfo);
- jpeg_destroy_compress(&cinfo);
- if (rawImage != NULL) free(rawImage);
-
- if (outfile == NULL) {
- LOGE("Fail to open file");
- return -1;
- } else {
- fclose(outfile);
- }
- return 0;
-}
-
-int Utility::CheckYUV(int x, int y) {
-
- /* screen capture */
- IVideoCapture* VCObjptr = IVideoCapture::getInstance();
-
- int CAPTURE_WIDTH = 640;
- int CAPTURE_HEIGHT = 360;
- int CAPTURE_BUF_SIZE = CAPTURE_WIDTH * CAPTURE_HEIGHT;
- char ybuff[CAPTURE_BUF_SIZE] = {0};
- char cbuff[CAPTURE_BUF_SIZE] = {0};
-
- IVideoCapture::InputParams input_params;
- input_params.capture_w = 640;
- input_params.capture_h = 360;
-
- IVideoCapture::OutputParams output_params;
- output_params.p_y_addr = ybuff;
- output_params.p_c_addr = cbuff;
- output_params.size_y = CAPTURE_BUF_SIZE;
- output_params.size_c = CAPTURE_BUF_SIZE;
-
- sleep(1);
-
- VCObjptr->getVideoPostYUV(input_params, output_params);
-
- /* check YUV value. As the capture size (640 x 360) is mapped with the full screen (1920 x 1080), the position should be resized. */
- int new_X = x / 3;
- int new_Y = y / 3;
- int position = CAPTURE_WIDTH * (new_Y - 1) + new_X;
-
- LOGE("Y value : %d", (int)ybuff[position]);
- return (int)ybuff[position];
-}
-
-bool Utility::IsAudioDisconnected() {
- TZTVAudioSource src = AUDIO_SOURCE_MAX;
- EXPECT_EQ(audioControl->getMainOutSourceSelect(&src), 0);
- return (src != AUDIO_MULTIMEDIA_DEC0);
-}
-
-bool Utility::IsAudioMute() {
- long audioMute = 0;
- EXPECT_EQ(audioDiagnoser->Diagnosis_GetBoolean(0, "main out mute", &audioMute), 0);
- return (audioMute != 0);
-}
} // namespace utils
#include "gtest/gtest.h"
int main(int argc, char *argv[]) {
-
+
::testing::InitGoogleTest(&argc, argv);
::testing::InitGoogleMock(&argc, argv);
auto ret = -1;
ret = RUN_ALL_TESTS();
-
+
return ret;
}