Files
2026-08-24 10:03:24 +08:00

149 lines
4.6 KiB
C

/*
* Copyright (C) 2025 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 <pthread.h>
#include <stdbool.h>
#include "ccdatabase/dataserver_client.h"
#include "ccdatabase/dataserver_cmd_resp.h"
#include "ccdatabase/dataserver_data_userdata.h"
#include "ccdatabase/dataserver_data_vbi.h"
#include "ccdatabase/dataserver_message.h"
#ifdef __cplusplus
extern "C" {
#endif
#define CC_POLL_TIMEOUT (16)
#define USERDATA_POLL_TIMEOUT (100)
#define MAX_CC_DATA_LEN (1024 * 5 + 4)
#define AMSTREAM_USDRDATA_DEV_FILE "/dev/amstream_userdata"
#define CC_VBI_DEV_FILE "/dev/vbi"
#define MEDIA_PROXY_DEV_FILE "/dev/mediaproxy"
/* CC source manager handle */
typedef void *CcSourceMgrHnd;
/* DTV cc userdata data callback */
typedef void (*CcSourceUserdataCallback)(CcSourceMgrHnd handle, void *data);
/* ATV cc data callback */
typedef void (*CcSourceVbiDataCallback)(CcSourceMgrHnd handle, void *data);
/* ATV cc event callback */
typedef void (*CcSourceVbiEventHandler)(CcSourceMgrHnd handle);
/* CC data source type */
typedef enum {
CC_SOURCE_TYPE_AMSTREAM_DEVICE = 0, // /dev/amstream_userdata
CC_SOURCE_TYPE_VBI_DEVICE, // /dev/vbi
CC_SOURCE_TYPE_MEDIA_PROXY, // /dev/mediaproxy
CC_SOURCE_TYPE_CCDATASERVER_AMSTREAM_DEVICE, // dataserver /dev/amstream_userdata
CC_SOURCE_TYPE_CCDATASERVER_VBI_DEVICE, // dataserver /dev/vbi
CC_SOURCE_TYPE_CCDATASERVER_MEDIA_PROXY // dataserver /dev/mediaproxy
} CcSourceType;
/* CC data source ops status */
typedef enum {
CC_SOURCE_INVALID = -1,
CC_SOURCE_FAIL = 0,
CC_SOURCE_OK,
} CcSourceStatus;
/* CC data source ops param */
typedef struct {
int playerId;
CcSourceType srcType;
CcSourceUserdataCallback uDataCb; // Userdata data callback
CcSourceVbiDataCallback vDataCb; // Vbi data callback
CcSourceVbiEventHandler vEvtHandler; // Vbi event handler
char owner[32];
} CcSourceStartParam;
/* CC source vbi context */
typedef struct {
int last;
int now;
int timeout;
int last_data_mask;
} CcSourceVbiCtx;
/* CC data source userdata param */
struct CcSourceUserdataParam {
uint32_t version;
uint32_t instance_id; // input, 0~9
uint32_t buf_len; // input
uint32_t data_size; // output
void *pbuf_addr; // input
struct userdata_meta_info_t meta_info; // output
};
/* CC data source context */
typedef struct {
bool running;
char devFile[32];
CcSourceStartParam param;
CcSourceVbiCtx vCtx;
pthread_t thread;
pthread_mutex_t lock;
ds_conn_t *das;
ds_conn_t *(*das_connect)();
void *privData;
} CcSourceCtx;
/** Create a new close caption source manager
* [out] CcSourceMgrHnd Return the source handle
*/
CcSourceMgrHnd ccSourceManagerCreate();
/** Release a close caption source manager
* [in] CcSourceMgrHnd source handle
* [out] CcSourceStatus Close caption source status
*/
CcSourceStatus ccSourceManagerDestroy(CcSourceMgrHnd handle);
/** start a close caption source manager
* [in] CcSourceMgrHnd & cc source param
* [out] CcSourceStatus Close caption source status
*/
CcSourceStatus ccSourceManagerStart(CcSourceMgrHnd handle, CcSourceStartParam *param);
/** stop a close caption source manager
* [in] CcSourceMgrHnd
* [out] CcSourceStatus Close caption source status
*/
CcSourceStatus ccSourceManagerStop(CcSourceMgrHnd handle);
#ifdef __cplusplus
}
#endif