/* * Copyright (C) 2014-2026 Amlogic, Inc. All rights reserved. * * All information contained herein is Amlogic confidential. * * This software is provided to you pursuant to Software License Agreement * (SLA) with Amlogic Inc ("Amlogic"). This software may be used * only in accordance with the terms of this agreement. * * Redistribution and use in source and binary forms, with or without * modification is strictly prohibited without prior written permission from * Amlogic. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include #include #include "SubtitleAPICommon.h" #ifdef __cplusplus extern "C" { #endif // DATA Type: All first char is upper Case letter. // API functions: symbols start with "amlsub_" typedef void *AmlSubtitleHnd; /*enum OpenType : int32_t { TYPE_MIDDLEWARE = 0, // from middleware, which no UI. TYPE_APPSDK, // use SubtitleManager java SDK }; */ // must keep sync with SubtitleServer. typedef enum { DTV_SUB_INVALID = -1, DTV_SUB_CC = 2, DTV_SUB_SCTE27 = 3, DTV_SUB_DVB = 4, DTV_SUB_DVB_TELETEXT = 5, DTV_SUB_DVB_TTML = 6, DTV_SUB_ARIB24 = 7, DTV_SUB_SMPTE_TTML = 8, } DtvSubtitleType; typedef enum { E_SUBTITLE_FMQ = 0, /* for soft support subtitle data, use hidl FastMessageQueue */ E_SUBTITLE_DEV, /* use /dev/amstream_sub_read as the IO source */ E_SUBTITLE_FILE, /* for external subtitle file */ E_SUBTITLE_SOCK, /* deprecated, android not permit to use anymore */ E_SUBTITLE_DEMUX, /* use aml hwdemux as the data source */ E_SUBTITLE_VBI, /* use /dev/vbi as the IO source */ E_SUBTITLE_USERDATA, /* use Userdata as the data source */ } AmlSubtitleIOType; typedef enum { MODE_SUBTITLE_PIP_PLAYER = 1, MODE_SUBTITLE_PIP_MEDIASYNC, } AmlSubtitlePipMode; typedef enum { SUB_DATA_TYPE_STRING = 0, SUB_DATA_TYPE_CC_JSON = 1, SUB_DATA_TYPE_BITMAP = 2, SUB_DATA_TYPE_POSITION_BITMAP = 4, SUB_DATA_TYPE_QTONE = 0xAAAA, } AmlSubDataType; typedef enum { TYPE_SUBTITLE_INVALID = -1, TYPE_SUBTITLE_VOB = 0, // dvd subtitle TYPE_SUBTITLE_PGS, TYPE_SUBTITLE_MKV_STR, TYPE_SUBTITLE_SSA, TYPE_SUBTITLE_MKV_VOB, TYPE_SUBTITLE_TMD_TXT = 5, TYPE_SUBTITLE_IDX_SUB, // now discard TYPE_SUBTITLE_DVB, TYPE_SUBTITLE_DVB_TELETEXT, TYPE_SUBTITLE_TTML, TYPE_SUBTITLE_CLOSED_CAPTION, TYPE_SUBTITLE_SCTE27, TYPE_SUBTITLE_ARIB_B24, TYPE_SUBTITLE_SMPTE_TTML, // 13 TYPE_SUBTITLE_EXTERNAL, TYPE_SUBTITLE_MAX, } AmlSubtitletype; // typedef enum { // /*invalid calling, wrong parameter */ // SUB_STAT_INV = -1, // /* calling failed */ // SUB_STAT_FAIL = 0, // SUB_STAT_OK, // } AmlSubtitleStatus; typedef enum { SUBCMD_CC_VIDEO_FORMAT = 1, SUBCMD_CC_CHANNEL_ID = 2, SUBCMD_DVB_ANCILLARY_PAGE_ID = 3, SUBCMD_DVB_COMPOSITION_PAGE_ID = 4, SUBCMD_PID = 5, // For TTX and Teletext SUBCMD_TTX_COUNTRY_CODE = 10, } AmlSubtitleParamCmd; typedef enum { TT_EVENT_INVALID = -1, // These are the four FastText shortcuts, usually represented by red, green, // yellow and blue keys on the handset. TT_EVENT_QUICK_NAVIGATE_RED = 0, TT_EVENT_QUICK_NAVIGATE_GREEN, TT_EVENT_QUICK_NAVIGATE_YELLOW, TT_EVENT_QUICK_NAVIGATE_BLUE, // The ten numeric keys used to input page indexes. TT_EVENT_0, TT_EVENT_1, // 5 TT_EVENT_2, TT_EVENT_3, TT_EVENT_4, TT_EVENT_5, TT_EVENT_6, // 10 TT_EVENT_7, TT_EVENT_8, TT_EVENT_9, // This is the home key, which returns to the nominated index page for this service. TT_EVENT_INDEXPAGE, // These are used to quickly increment/decrement the page index. TT_EVENT_NEXTPAGE, // 15 TT_EVENT_PREVIOUSPAGE, // These are used to navigate the sub-pages when in 'hold' mode. TT_EVENT_NEXTSUBPAGE, TT_EVENT_PREVIOUSSUBPAGE, // These are used to traverse the page history (if caching requested). TT_EVENT_BACKPAGE, TT_EVENT_FORWARDPAGE, // 20 // This is used to toggle hold on the current page. TT_EVENT_HOLD, // Reveal hidden page content (as defined in EBU specification) TT_EVENT_REVEAL, // This key toggles 'clear' mode (page hidden until updated) TT_EVENT_CLEAR, // This key toggles 'clock only' mode (page hidden until updated) TT_EVENT_CLOCK, // Used to toggle transparent background ('video mix' mode) TT_EVENT_MIX_VIDEO, // 25 // Used to toggle double height top / double-height bottom / normal height display. TT_EVENT_DOUBLE_HEIGHT, // Functional enhancement may offer finer scrolling of double-height display. TT_EVENT_DOUBLE_SCROLL_UP, TT_EVENT_DOUBLE_SCROLL_DOWN, // Used to initiate/cancel 'timer' mode (clear and re-display page at set time) TT_EVENT_TIMER, // Used to go to home page with magazine + page TT_EVENT_GO_TO_PAGE, // 30 TT_EVENT_GO_TO_SUBTITLE, TT_EVENT_SET_REGION_ID, TT_EVENT_SUBPAGE_MODE, TT_EVENT_MIX_BLACK, TT_EVENT_MIX_TRANSPARENT, // 35 TT_EVENT_MIX_HALF_SCREEN, TT_EVENT_VBI_WST_LEVEL_1, TT_EVENT_VBI_WST_LEVEL_1p5, TT_EVENT_VBI_WST_LEVEL_2p5, TT_EVENT_VBI_WST_LEVEL_3p5, // 40 // Reset page and subpage number to current page and subpage number if input a wrong code. TT_EVENT_RESET_PAGE_NUMBER, TT_EVENT_RESET_SUBPAGE_NUMBER, // Set the page and subpage number directly TT_EVENT_SET_PAGE_NUMBER, TT_EVENT_SET_SUBPAGE_NUMBER } AmlTeletextEvent; typedef struct { const char *extSubPath; AmlSubtitleIOType ioSource; int subtitleType = 0; int pid = 0; int videoFormat = 0; // cc int channelId = 0; // cc int ancillaryPageId = 0; // dvb int compositionPageId = 0; // dvb int dmxId; int fd = 0; int flag = 0; const char *lang; } AmlSubtitleParam; typedef struct { // clang-format off int magazine = -1; // Teletext usually uses magazines to organize information. // There are at most 8 different magazines, // 100-199 (M=1), 200-299 (M=2), 300-399 (M=3), 400-499 (M =4), // 500-599 (M=5), 600-699 (M=6), 700-799 (M=7), 800-899 (M=0) // clang-format on int page = -1; // Home page number int subPageNo = -1; // Subpage page number int pageDir = 0; // +1:next page, -1: last page int subpagedir = 0; // +1:next sub page, -1: last sub page int regionid = -1; // Country subset specification, range (0~87), default G0 and G2 int flag = -1; // Flag of whether to encrypt or not, 0 means unencrypted, 1 means encrypted AmlTeletextEvent event = TT_EVENT_INVALID; } AmlTeletextCtrlParam; // Callback functions. typedef void (*AmlSubtitleDataCb)(const char *data, int size, AmlSubDataType type, int x, int y, int width, int height, int videoWidth, int videoHeight, int showing); typedef void (*AmlAfdEventCb)(int event); typedef void (*AmlChannelUpdateCb)(int event, int id); typedef void (*AmlSubtitleAvailCb)(int avail); typedef void (*AmlSubtitleDimensionCb)(int width, int height); typedef void (*AmlSubtitleLanguageCb)(std::string lang); typedef void (*AmlSubtitleInfoCb)(int what, int extra); typedef void (*AmlMixVideoEventCb)(int val); //////////////////////////////////////////////////////////// ///////////////////// Session manager ////////////////////// //////////////////////////////////////////////////////////// AmlSubtitleHnd amlsub_Create(); AmlSubtitleStatus amlsub_Destroy(AmlSubtitleHnd handle); /** *Get unique sessionId created from server. */ AmlSubtitleStatus amlsub_GetSessionId(AmlSubtitleHnd handle, int *sId); //////////////////////////////////////////////////////////// ///////////////////// generic control ////////////////////// //////////////////////////////////////////////////////////// /** * open, start to play subtitle. * Param: * handle: current subtitle handle. * path: the subtitle external file path. */ AmlSubtitleStatus amlsub_Open(AmlSubtitleHnd handle, AmlSubtitleParam *param); AmlSubtitleStatus amlsub_Close(AmlSubtitleHnd handle); /** * reset current play, mostly, used for seek. */ AmlSubtitleStatus amlsub_Reset(AmlSubtitleHnd handle); //////////////////////////////////////////////////////////// //////////////// DTV operation/param related /////////////// //////////////////////////////////////////////////////////// AmlSubtitleStatus amlsub_SetParameter(AmlSubtitleHnd handle, AmlSubtitleParamCmd cmd, void *value, int paramSize); int amlsub_GetParameter(AmlSubtitleHnd handle, AmlSubtitleParamCmd cmd, void *value); int amlsub_getSubtitleStatus(AmlSubtitleHnd handle, int type, int event); AmlSubtitleStatus amlsub_TeletextControl(AmlSubtitleHnd handle, AmlTeletextCtrlParam *param); AmlSubtitleStatus amlsub_SelectCcChannel(AmlSubtitleHnd handle, int ch); AmlSubtitleStatus amlsub_SetPip(AmlSubtitleHnd handle, AmlSubtitlePipMode mode, int value); //////////////////////////////////////////////////////////// ////// Regist callbacks for subtitle Event and data //////// //////////////////////////////////////////////////////////// AmlSubtitleStatus amlsub_RegistOnDataCB(AmlSubtitleHnd handle, AmlSubtitleDataCb listener); AmlSubtitleStatus amlsub_RegistAfdEventCB(AmlSubtitleHnd handle, AmlAfdEventCb listener); AmlSubtitleStatus amlsub_RegistOnChannelUpdateCb(AmlSubtitleHnd handle, AmlChannelUpdateCb listener); AmlSubtitleStatus amlsub_RegistOnSubtitleAvailCb(AmlSubtitleHnd handle, AmlSubtitleAvailCb listener); AmlSubtitleStatus amlsub_RegistGetDimensionCb(AmlSubtitleHnd handle, AmlSubtitleDimensionCb listener); AmlSubtitleStatus amlsub_RegistOnSubtitleLanguageCb(AmlSubtitleHnd handle, AmlSubtitleLanguageCb listener); AmlSubtitleStatus amlsub_RegistOnSubtitleInfoCB(AmlSubtitleHnd handle, AmlSubtitleInfoCb listener); AmlSubtitleStatus amlsub_RegistOnMixVideoEventCB(AmlSubtitleHnd handle, AmlMixVideoEventCb listener); //////////////////////////////////////////////////////////// //////////////////// Standalone UI related ///////////////// //////////////////////////////////////////////////////////// /* Bellow APIs only available for control standalone subtitle display */ /* !!!!DEPRECATED!!!! suggest not use this. */ /* Suggest: 1. Java App use SubtitleManager java API to display subtitle. 2. use above callback functions receive decoded SPU and render locally. */ AmlSubtitleStatus amlsub_UiShow(AmlSubtitleHnd handle); AmlSubtitleStatus amlsub_UiHide(AmlSubtitleHnd handle); /* Only available for text subtitle */ AmlSubtitleStatus amlsub_UiSetTextColor(AmlSubtitleHnd handle, int color); AmlSubtitleStatus amlsub_UiSetTextSize(AmlSubtitleHnd handle, int sp); AmlSubtitleStatus amlsub_UiSetGravity(AmlSubtitleHnd handle, int gravity); AmlSubtitleStatus amlsub_UiSetPosHeight(AmlSubtitleHnd handle, int yOffset); AmlSubtitleStatus amlsub_UiSetImgRatio(AmlSubtitleHnd handle, float ratioW, float ratioH, int maxW, int maxH); AmlSubtitleStatus amlsub_UiSetSurfaceViewRect(AmlSubtitleHnd handle, int x, int y, int width, int height); AmlSubtitleStatus amlsub_UpdateVideoPos(AmlSubtitleHnd handle, int64_t pos); #ifdef __cplusplus } #endif