3.3. 數字電視解複用器 kABI¶
3.3.1. 數字電視解複用器¶
核心數字電視解複用器 kABI 定義了一個驅動程式內部介面,用於將底層、硬體特定的驅動程式註冊到硬體獨立的解複用層。它只對數字電視裝置驅動程式編寫者感興趣。此 kABI 的標頭檔案名為 demux.h,位於 include/media 中。
應為系統中的每個解複用器實現解複用器 kABI。它用於選擇解複用器的 TS 源並管理解複用器資源。當解複用器客戶端透過解複用器 kABI 分配資源時,它會收到指向該資源 kABI 的指標。
每個解複用器都從 DVB 前端或記憶體接收其 TS 輸入,這是透過此解複用器 kABI 設定的。在具有多個前端的系統中,kABI 可用於選擇其中一個 DVB 前端作為解複用器的 TS 源,除非這在 HW 平臺中是固定的。
解複用器 kABI 僅控制與解複用器的連線有關的前端;用於設定其他前端引數(如調諧)的 kABI 透過數字電視前端 kABI 定義。
實現抽象介面解複用器的函式應定義為靜態或模組私有,並註冊到解複用器核心以進行外部訪問。不必實現 dmx_demux 結構中的每個函式。例如,解複用器介面可能支援 Section 過濾,但不支援 PES 過濾。kABI 客戶端應在呼叫函式之前檢查任何函式指標的值:NULL 值表示該函式不可用。
每當解複用器 API 的函式修改共享資料時,應解決丟失更新和競爭條件問題的可能性,例如,透過使用互斥鎖保護部分程式碼。
請注意,從下半部上下文呼叫的函式不得睡眠。即使不使用 GFP_ATOMIC 的簡單記憶體分配也可能導致核心執行緒進入睡眠狀態(如果需要交換)。例如,Linux 核心從下半部上下文呼叫網路裝置介面的函式。因此,如果從網路裝置程式碼呼叫解複用器 kABI 函式,則該函式不得睡眠。
3.3.2. 解複用器回撥 API¶
此核心空間 API 包括將過濾後的資料傳遞到解複用器客戶端的回撥函式。與其他 DVB kABI 不同,這些函式由客戶端提供並從解複用器程式碼中呼叫。
此抽象介面的函式指標未像其他解複用器 API 中那樣打包到結構中,因為回撥函式是彼此獨立註冊和使用的。例如,API 客戶端可以提供多個用於接收 TS 資料包的回撥函式,而沒有用於 PES 資料包或 Section 的回撥。
實現回撥 API 的函式不需要是可重入的:當解複用器驅動程式呼叫這些函式之一時,驅動程式在原始呼叫返回之前不允許再次呼叫該函式。如果回撥由硬體中斷觸發,建議使用 Linux 下半部機制或啟動任務小程式,而不是直接從硬體中斷進行回撥函式呼叫。
此機制由 dmx_ts_cb() 和 dmx_section_cb() 回撥實現。
3.3.3. 數字電視解複用器設備註冊函式和資料結構¶
-
enum dmxdev_type¶
解複用器篩選器型別的型別。
常量
DMXDEV_TYPE_NONE未設定篩選器。
DMXDEV_TYPE_SECSection 篩選器。
DMXDEV_TYPE_PES節目基本流 (PES) 篩選器。
-
enum dmxdev_state¶
dmxdev 的狀態機。
常量
DMXDEV_STATE_FREE指示篩選器已釋放。
DMXDEV_STATE_ALLOCATED指示已分配篩選器以供使用。
DMXDEV_STATE_SET指示已設定篩選器引數。
DMXDEV_STATE_GO指示篩選器正在執行。
DMXDEV_STATE_DONE指示已篩選資料包並且篩選器現已停用。僅在
DMX_ONESHOT設定。請參閱dmx_sct_filter_params。DMXDEV_STATE_TIMEDOUT指示超時情況。
-
struct dmxdev_feed¶
數字電視 dmxdev 饋送
定義:
struct dmxdev_feed {
u16 pid;
struct dmx_ts_feed *ts;
struct list_head next;
};
成員
pid要篩選的節目 ID
ts指向
struct dmx_ts_feed的指標nextstruct list_head指向下一個饋送。
-
struct dmxdev_filter¶
數字電視 dmxdev 篩選器
定義:
struct dmxdev_filter {
union {
struct dmx_section_filter *sec;
} filter;
union {
struct list_head ts;
struct dmx_section_feed *sec;
} feed;
union {
struct dmx_sct_filter_params sec;
struct dmx_pes_filter_params pes;
} params;
enum dmxdev_type type;
enum dmxdev_state state;
struct dmxdev *dev;
struct dvb_ringbuffer buffer;
struct dvb_vb2_ctx vb2_ctx;
struct mutex mutex;
struct timer_list timer;
int todo;
u8 secheader[3];
};
成員
篩選器描述 dmxdev 篩選器的聯合。當前僅用於 Section 篩選器。
filter.seca
struct dmx_section_filter指標。僅用於 Section 篩選器。feed描述 dmxdev 饋送的聯合。根據篩選器型別,它可以是 feed.ts 或 feed.sec。
feed.tsa
struct list_head列表。用於 TS 和 PES 饋送。feed.seca
struct dmx_section_feed指標。僅用於 Section 饋送。params描述 dmxdev 篩選器引數的聯合。根據篩選器型別,它可以是 params.sec 或 params.pes。
params.seca
struct dmx_sct_filter_params嵌入式結構。僅用於 Section 篩選器。params.pesa
struct dmx_pes_filter_params嵌入式結構。僅用於 PES 篩選器。typedmxdev 篩選器的型別,由
enum dmxdev_type定義。statedmxdev 篩選器的狀態,由
enum dmxdev_state定義。dev指向
struct dmxdev的指標。buffer一個嵌入式
struct dvb_ringbuffer緩衝區。vb2_ctxVB2 處理程式的控制結構
mutex保護對
struct dmxdev_filter的訪問。timerstruct timer_list嵌入式計時器,用於檢查饋送超時。僅用於 Section 篩選器。todosecheader 的索引。僅用於 Section 篩選器。
secheader用於分析 Section 標頭的緩衝區快取。僅用於 Section 篩選器。
-
struct dmxdev¶
描述數字電視解複用器裝置。
定義:
struct dmxdev {
struct dvb_device *dvbdev;
struct dvb_device *dvr_dvbdev;
struct dmxdev_filter *filter;
struct dmx_demux *demux;
int filternum;
int capabilities;
unsigned int may_do_mmap:1;
unsigned int exit:1;
#define DMXDEV_CAP_DUPLEX 1;
struct dmx_frontend *dvr_orig_fe;
struct dvb_ringbuffer dvr_buffer;
#define DVR_BUFFER_SIZE (10*188*1024);
struct dvb_vb2_ctx dvr_vb2_ctx;
struct mutex mutex;
spinlock_t lock;
};
成員
dvbdev指向與解複用器裝置節點關聯的
struct dvb_device的指標。dvr_dvbdev指向與 dvr 裝置節點關聯的
struct dvb_device的指標。篩選器指向
struct dmxdev_filter的指標。demux指向
struct dmx_demux的指標。filternum篩選器的數量。
capabilities解複用器功能,由
enum dmx_demux_caps定義。may_do_mmap用於指示裝置是否可以進行 mmap 的標誌。
exit指示正在釋放解複用器的標誌。
dvr_orig_fe指向
struct dmx_frontend的指標。dvr_buffer用於 DVB 輸出的嵌入式
struct dvb_ringbuffer。dvr_vb2_ctxVB2 處理程式的控制結構
mutex保護此結構的使用。
lock保護對
dmxdev->filter->data 的訪問。
-
int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *adap)¶
初始化數字電視解複用器並註冊解複用器和 DVR 裝置。
引數
struct dmxdev *dmxdev指向
struct dmxdev的指標。struct dvb_adapter *adap指向
struct dvb_adapter的指標。
引數
struct dmxdev *dmxdev指向
struct dmxdev的指標。
3.3.4. 高階數字電視解複用器介面¶
-
enum dvb_dmx_filter_type¶
解複用器饋送的型別。
常量
DMX_TYPE_TS饋送處於 TS 模式。
DMX_TYPE_SEC饋送處於 Section 模式。
-
enum dvb_dmx_state¶
解複用器篩選器的狀態機。
常量
DMX_STATE_FREE指示篩選器已釋放。
DMX_STATE_ALLOCATED指示已分配篩選器以供使用。
DMX_STATE_READY指示篩選器已準備好使用。
DMX_STATE_GO指示篩選器正在執行。
-
struct dvb_demux_filter¶
描述 DVB 解複用器 Section 篩選器。
定義:
struct dvb_demux_filter {
struct dmx_section_filter filter;
u8 maskandmode[DMX_MAX_FILTER_SIZE];
u8 maskandnotmode[DMX_MAX_FILTER_SIZE];
bool doneq;
struct dvb_demux_filter *next;
struct dvb_demux_feed *feed;
int index;
enum dvb_dmx_state state;
enum dvb_dmx_filter_type type;
};
成員
篩選器Section 篩選器,由
struct dmx_section_filter定義。maskandmode邏輯
and位掩碼。maskandnotmode邏輯
and not位掩碼。doneq指示篩選器何時準備就緒的標誌。
next指向下一個 Section 篩選器的指標。
feedindex使用的解複用器篩選器的索引。
state篩選器的狀態,由
enum dvb_dmx_state描述。type篩選器的型別,由
enum dvb_dmx_filter_type描述。
-
struct dvb_demux_feed¶
描述 DVB 欄位
定義:
struct dvb_demux_feed {
union {
struct dmx_ts_feed ts;
struct dmx_section_feed sec;
} feed;
union {
dmx_ts_cb ts;
dmx_section_cb sec;
} cb;
struct dvb_demux *demux;
void *priv;
enum dvb_dmx_filter_type type;
enum dvb_dmx_state state;
u16 pid;
ktime_t timeout;
struct dvb_demux_filter *filter;
u32 buffer_flags;
enum ts_filter_type ts_type;
enum dmx_ts_pes pes_type;
int cc;
bool pusi_seen;
u16 peslen;
struct list_head list_head;
unsigned int index;
};
成員
feed描述數字電視饋送的聯合。根據饋送型別,它可以是 feed.ts 或 feed.sec。
feed.tsa
struct dmx_ts_feed指標。僅用於 TS 饋送。feed.seca
struct dmx_section_feed指標。僅用於 Section 饋送。cb描述數字電視回撥的聯合。根據饋送型別,它可以是 cb.ts 或 cb.sec。
cb.tsa
dmx_ts_cb()回撥函式指標。僅用於 TS 饋送。cb.seca
dmx_section_cb()回撥函式指標。僅用於 Section 饋送。demux指向
struct dvb_demux的指標。privDVB 驅動程式可以選擇使用的私有資料。
type篩選器的型別,由
enum dvb_dmx_filter_type定義。state篩選器的狀態,由
enum dvb_dmx_state定義。pid要篩選的 PID。
timeout饋送超時。
篩選器指向
struct dvb_demux_filter的指標。buffer_flags用於透過 DVB 記憶體對映 API 報告不連續性使用者的緩衝區標誌,由
enum dmx_buffer_flags定義。ts_typeTS 的型別,由
enum ts_filter_type定義。pes_typePES 的型別,由
enum dmx_ts_pes定義。ccMPEG-TS 資料包連續性計數器
pusi_seen如果為 true,則指示檢測到不連續性。它用於防止饋送先前 Section 中的垃圾。
peslenPES(資料包基本流)的長度。
list_head數字電視解複用器饋送列表的頭部。
index每個饋送的唯一索引。可以用作硬體 pid 篩選器索引。
-
struct dvb_demux¶
表示數字電視解複用器
定義:
struct dvb_demux {
struct dmx_demux dmx;
void *priv;
int filternum;
int feednum;
int (*start_feed)(struct dvb_demux_feed *feed);
int (*stop_feed)(struct dvb_demux_feed *feed);
int (*write_to_decoder)(struct dvb_demux_feed *feed, const u8 *buf, size_t len);
u32 (*check_crc32)(struct dvb_demux_feed *feed, const u8 *buf, size_t len);
void (*memcopy)(struct dvb_demux_feed *feed, u8 *dst, const u8 *src, size_t len);
int users;
#define MAX_DVB_DEMUX_USERS 10;
struct dvb_demux_filter *filter;
struct dvb_demux_feed *feed;
struct list_head frontend_list;
struct dvb_demux_feed *pesfilter[DMX_PES_OTHER];
u16 pids[DMX_PES_OTHER];
#define DMX_MAX_PID 0x2000;
struct list_head feed_list;
u8 tsbuf[204];
int tsbufp;
struct mutex mutex;
spinlock_t lock;
uint8_t *cnt_storage;
ktime_t speed_last_time;
uint32_t speed_pkts_cnt;
};
成員
dmx嵌入式
struct dmx_demux,具有解複用器功能和回撥。privDVB 驅動程式可以選擇使用的私有資料。
filternumdvbfilternum
DVB 篩選器的最大數量。feednum
DVB 饋送的最大數量。start_feed
為了啟動 DVB 饋送而要呼叫的回撥例程。stop_feed
為了停止 DVB 饋送而要呼叫的回撥例程。write_to_decoder
如果饋送是 TS 且路由到 A/V 解碼器,則在收到新的 TS 資料包時要呼叫的回撥例程。僅在 av7110-av.c 上使用。check_crc32
用於檢查 CRC 的回撥例程。如果未初始化,dvb_demux 將使用內部例程。memcopy
用於儲存收到的資料的回撥例程。如果未初始化,dvb_demux 將預設為memcpy()。users
篩選器指向
struct dvb_demux_filter的指標。feed用於儲存已開啟的檔案描述符數量的計數器。當前,它限制為 10 個使用者。
filter指向
struct dvb_demux_feed的指標。frontend_list具有解複用器使用的前端的
struct list_head。pesfilter具有要篩選的 PES 型別的
struct dvb_demux_feed陣列。pids篩選的節目 ID 列表。
feed_list具有饋送的
struct list_head。tsbuf用於在內部儲存 TS 資料包的臨時緩衝區。
mutextsbufp
lock在內部使用的臨時緩衝區索引。
mutex指向
struct mutex的指標,用於保護饋送設定邏輯。lock指向
spinlock_t的指標,用於保護緩衝區處理。cnt_storage用於 TS/TEI 連續性檢查的緩衝區。
-
speed_last_time
用於 TS 速度檢查的
ktime_t。
引數
speed_pkts_cnt用於 TS 速度檢查的資料包計數。
int dvb_dmx_init(struct dvb_demux *demux)¶
初始化數字電視解複用器結構。
struct dvb_demux *demux
dvb->demux.dmx.capabilities =
DMX_TS_FILTERING | DMX_SECTION_FILTERING |
DMX_MEMORY_BASED_FILTERING;
dvb->demux.priv = dvb;
dvb->demux.filternum = 256;
dvb->demux.feednum = 256;
dvb->demux.start_feed = driver_start_feed;
dvb->demux.stop_feed = driver_stop_feed;
ret = dvb_dmx_init(&dvb->demux);
if (ret < 0)
return ret;
-
要初始化的
struct dvb_demux。 描述
引數
speed_pkts_cnt在能夠註冊數字電視解複用器結構之前,驅動程式應呼叫此例程。在其典型用法中,應在驅動程式中初始化一些欄位,然後再呼叫它。
int dvb_dmx_init(struct dvb_demux *demux)¶
一個典型的用例是
引數
speed_pkts_cntstruct dvb_demux要釋放的結構。DVB 核心在內部在 demux 處分配資料。此例程釋放這些資料。請注意,結構本身不會釋放,因為它可能會嵌入在其他結構中。void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t count)¶
將 dvb 軟體篩選器用於緩衝區,該緩衝區具有多個 MPEG-TS 資料包,每個資料包 188 個位元組。指標指向
struct dvb_demux
int dvb_dmx_init(struct dvb_demux *demux)¶
const u8 *buf
要篩選的資料的緩衝區
size_t count
大小為 188 的 MPEG-TS 資料包的數量。
-
例程將丟棄不以 0x47 開頭的 DVB 資料包。
釋放數字電視解複用器內部緩衝區。
引數
speed_pkts_cntstruct dvb_demux要釋放的結構。DVB 核心在內部在 demux 處分配資料。此例程釋放這些資料。請注意,結構本身不會釋放,因為它可能會嵌入在其他結構中。void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t count)¶
將 dvb 軟體篩選器用於緩衝區,該緩衝區具有多個 MPEG-TS 資料包,每個資料包 188 個位元組。指標指向
struct dvb_demux
int dvb_dmx_init(struct dvb_demux *demux)¶
如果 DVB 解複用器填充已對齊的 MPEG-TS 緩衝區,請使用此例程。
注意
size_t count
大小為 188 的 MPEG-TS 資料包的數量。
-
void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, size_t count)¶
對具有多個每個 204 位元組 MPEG-TS 資料包的緩衝區使用 dvb 軟體過濾器。
引數
speed_pkts_cntstruct dvb_demux要釋放的結構。DVB 核心在內部在 demux 處分配資料。此例程釋放這些資料。請注意,結構本身不會釋放,因為它可能會嵌入在其他結構中。void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf, size_t count)¶
將 dvb 軟體篩選器用於緩衝區,該緩衝區具有多個 MPEG-TS 資料包,每個資料包 188 個位元組。大小為 204 的 MPEG-TS 資料包的數量。
int dvb_dmx_init(struct dvb_demux *demux)¶
如果 DVB 解複用器填充已對齊的 MPEG-TS 緩衝區,請使用此例程。
注意
size_t count
buf 的大小應等於 count * 204。
引數
speed_pkts_cntstruct dvb_demux要釋放的結構。DVB 核心在內部在 demux 處分配資料。此例程釋放這些資料。請注意,結構本身不會釋放,因為它可能會嵌入在其他結構中。包含資料的緩衝區
將 dvb 軟體篩選器用於緩衝區,該緩衝區具有多個 MPEG-TS 資料包,每個資料包 188 個位元組。要傳遞的資料包數量。每個資料包的實際大小取決於
dvb_demux->feed->cb.ts 邏輯。
int dvb_dmx_init(struct dvb_demux *demux)¶
如果驅動程式需要將原始有效負載傳遞到使用者空間,而無需透過核心解複用器,請使用此選項。這意味著支援一些不是基於 MPEG-TS 的傳輸系統。
此函式依賴於 dvb_demux->feed->cb.ts 來實際處理緩衝區。
3.3.5. 驅動程式內部低階硬體特定驅動程式解複用器介面¶
-
enum ts_filter_type¶
dmx_ts_feed.set() 的過濾器型別點陣圖
常量
TS_PACKET將 TS 資料包(188 位元組)傳送到回撥(預設)。
TS_PAYLOAD_ONLY如果設定了 TS_PACKET,則僅將 TS 有效負載(每個資料包 <=184 位元組)傳送到回撥
TS_DECODER將流傳送到內建解碼器(如果存在)。
TS_DEMUX如果設定了 TS_PACKET,則將 TS 傳送到解複用裝置,而不是 dvr 裝置
-
struct dmx_ts_feed¶
包含 TS 饋送過濾器的結構
定義:
struct dmx_ts_feed {
int is_filtering;
struct dmx_demux *parent;
void *priv;
int (*set)(struct dmx_ts_feed *feed,u16 pid,int type,enum dmx_ts_pes pes_type, ktime_t timeout);
int (*start_filtering)(struct dmx_ts_feed *feed);
int (*stop_filtering)(struct dmx_ts_feed *feed);
};
成員
is_filtering當正在進行過濾時,設定為非零值
parent指向
struct dmx_demux的指標priv指向 API 客戶端的私有資料的指標
set設定 TS 過濾器
start_filtering啟動 TS 過濾
stop_filtering停止 TS 過濾
int dvb_dmx_init(struct dvb_demux *demux)¶
TS 饋送通常對映到解複用器晶片上的硬體 PID 過濾器。使用此 API,客戶端可以設定過濾屬性以啟動/停止特定 TS 饋送上的 TS 資料包過濾。
-
struct dmx_section_filter¶
描述節過濾器的結構
定義:
struct dmx_section_filter {
u8 filter_value[DMX_MAX_FILTER_SIZE];
u8 filter_mask[DMX_MAX_FILTER_SIZE];
u8 filter_mode[DMX_MAX_FILTER_SIZE];
struct dmx_section_feed *parent;
void *priv;
};
成員
filter_value包含 TS 節標頭的最多 16 個位元組(128 位),節過濾器將匹配這些位元組
filter_mask包含 16 個位元組(128 位)的過濾器掩碼,其中 filter_value 指定的位將用於過濾器匹配邏輯。
filter_mode包含 16 個位元組(128 位)的過濾器模式。
parent指向
struct dmx_section_feed的反向指標。priv指向 API 客戶端的私有資料的指標。
int dvb_dmx_init(struct dvb_demux *demux)¶
filter_mask 控制將 filter_value 的哪些位與節標頭/有效負載進行比較。在 filter_mask 中的二進位制值 1 上,將比較相應的位。過濾器僅接受所有經過測試的位位置上等於 filter_value 的節。
-
struct dmx_section_feed¶
包含節饋送過濾器的結構
定義:
struct dmx_section_feed {
int is_filtering;
struct dmx_demux *parent;
void *priv;
int check_crc;
int (*set)(struct dmx_section_feed *feed,u16 pid, int check_crc);
int (*allocate_filter)(struct dmx_section_feed *feed, struct dmx_section_filter **filter);
int (*release_filter)(struct dmx_section_feed *feed, struct dmx_section_filter *filter);
int (*start_filtering)(struct dmx_section_feed *feed);
int (*stop_filtering)(struct dmx_section_feed *feed);
};
成員
is_filtering當正在進行過濾時,設定為非零值
parent指向
struct dmx_demux的指標priv指向 API 客戶端的私有資料的指標
check_crc如果非零,則檢查已過濾節的 CRC 值。
set設定節過濾器
allocate_filter此函式用於在解複用器上分配節過濾器。僅當在此節饋送上未進行過濾時才應呼叫它。如果無法分配過濾器,則函式將失敗並返回 -ENOSPC。
release_filter此函式釋放先前分配的節過濾器的所有資源。在此節饋送上正在進行過濾時不應呼叫該函式。呼叫此函式後,呼叫方不應嘗試取消引用過濾器指標。
start_filtering啟動節過濾
stop_filtering停止節過濾
int dvb_dmx_init(struct dvb_demux *demux)¶
TS 饋送通常對映到解複用器晶片上的硬體 PID 過濾器。使用此 API,客戶端可以設定過濾屬性以啟動/停止特定 TS 饋送上的 TS 資料包過濾。
-
dmx_ts_cb¶
Typedef:DVB 解複用器 TS 過濾器回撥函式原型
語法
int dmx_ts_cb (const u8 *buffer1, size_t buffer1_length, const u8 *buffer2, size_t buffer2_length, struct dmx_ts_feed *source, u32 *buffer_flags)
引數
const u8 *buffer1指向已過濾 TS 資料包的起點的指標。
size_t buffer1_lengthbuffer1 中 TS 資料的長度。
const u8 *buffer2指向已過濾 TS 資料包的尾部的指標,或 NULL。
size_t buffer2_lengthbuffer2 中 TS 資料的長度。
struct dmx_ts_feed *source指示哪個 TS 饋送是回撥的源。
u32 *buffer_flags儲存緩衝區標誌的地址。這些標誌用於透過 DVB 記憶體對映 API 報告不連續使用者,如
enum dmx_buffer_flags定義的那樣。
int dvb_dmx_init(struct dvb_demux *demux)¶
此函式回撥原型由解複用器 API 的客戶端提供,從解複用器程式碼中呼叫。僅當使用 dmx_demux 處的 start_filtering() 函式啟用了 TS 饋送的過濾時,才會呼叫該函式。任何與過濾器設定匹配的 TS 資料包都會被複制到迴圈緩衝區。已過濾的 TS 資料包使用此回撥函式傳遞給客戶端。期望 buffer1 和 buffer2 回撥引數指向迴圈緩衝區中的地址,但其他實現也是可能的。請注意,被呼叫方不應嘗試釋放 buffer1 和 buffer2 引數指向的記憶體。
呼叫此函式時,buffer1 引數通常指向迴圈緩衝區中第一個未傳遞的 TS 資料包的起點。buffer2 緩衝區引數通常為 NULL,除非接收到的 TS 資料包已超過迴圈緩衝區的最後一個地址並“環繞”到緩衝區的開頭。在後一種情況下,buffer1 引數將包含迴圈緩衝區中的地址,而 buffer2 引數將包含迴圈緩衝區的第一個地址。使用此函式傳遞的位元組數(即 buffer1_length + buffer2_length)通常等於 set() 函式中給定的 callback_length 引數的值,但有一個例外:如果在接收 callback_length 位元組的 TS 資料之前發生超時,則任何未傳遞的資料包都會透過呼叫此函式立即傳遞給客戶端。超時持續時間由 TS 饋送 API 中的 set() 函式控制。
如果接收到 TS 資料包時出現 TS 級前向糾錯 (FEC) 無法修復的錯誤,則應設定 TS 資料包標頭的 Transport_error_indicator 標誌。不應丟棄 TS 資料包,因為可以透過更高的層協議來糾正錯誤。如果被呼叫方處理回撥的速度很慢,則迴圈緩衝區最終可能會填滿。如果發生這種情況,解複用器驅動程式應丟棄在緩衝區已滿時接收到的任何 TS 資料包,並返回 -EOVERFLOW。
可以透過 dmx_ts_feed.**set** 函式選擇返回給回撥的資料型別。型別引數決定應返回原始 TS 資料包 (TS_PACKET) 還是僅返回有效負載 (TS_PACKET|TS_PAYLOAD_ONLY)。如果另外設定了 TS_DECODER 位,則流也將傳送到硬體 MPEG 解碼器。
0,成功時;
-EOVERFLOW,緩衝區溢位時。
-
dmx_section_cb¶
Typedef:DVB 解複用器 TS 過濾器回撥函式原型
語法
int dmx_section_cb (const u8 *buffer1, size_t buffer1_len, const u8 *buffer2, size_t buffer2_len, struct dmx_section_filter *source, u32 *buffer_flags)
引數
const u8 *buffer1指向已過濾節的起點的指標,例如,在解複用器驅動程式的迴圈緩衝區中。
size_t buffer1_lenbuffer1 中已過濾節資料的長度,包括標頭和 CRC。
const u8 *buffer2指向已過濾節資料的尾部的指標,或 NULL。用於處理迴圈緩衝區的環繞。
size_t buffer2_lenbuffer2 中已過濾節資料的長度,包括標頭和 CRC。
struct dmx_section_filter *source指示哪個節饋送是回撥的源。
u32 *buffer_flags儲存緩衝區標誌的地址。這些標誌用於透過 DVB 記憶體對映 API 報告不連續使用者,如
enum dmx_buffer_flags定義的那樣。
int dvb_dmx_init(struct dvb_demux *demux)¶
此函式回撥原型由解複用器 API 的客戶端提供,從解複用器程式碼中呼叫。僅當使用函式 dmx_ts_feed.**start_filtering** 啟用了節的過濾時,才會呼叫該函式。當解複用器驅動程式收到與至少一個節過濾器匹配的完整節時,將透過此回撥函式通知客戶端。通常,為每個接收到的節呼叫此函式;但是,也可以使用一個回撥傳遞多個節,例如,當系統負載很高時。如果在接收節時發生錯誤,則應在 success 欄位中設定相應的錯誤型別的情況下呼叫此函式,無論是否有要傳遞的資料。節饋送實現應維護已接收節的迴圈緩衝區。但是,如果節饋送 API 實現為 TS 饋送 API 的客戶端,則這不是必需的,因為 TS 饋送實現隨後會緩衝接收到的資料。可以使用節饋送 API 中的 dmx_ts_feed.**set** 函式配置迴圈緩衝區的大小。如果收到新節時迴圈緩衝區中沒有空間,則必須丟棄該節。如果發生這種情況,則下次回撥時 success 引數的值應為 DMX_OVERRUN_ERROR。
-
enum dmx_frontend_source¶
用於標識前端型別
常量
DMX_MEMORY_FE解複用器的源是記憶體。這意味著要過濾的 MPEG-TS 來自使用者空間,透過 write() 系統呼叫。
DMX_FRONTEND_0解複用器的源是連線到解複用器的前端。
-
struct dmx_frontend¶
列出與解複用器關聯的前端的結構
定義:
struct dmx_frontend {
struct list_head connectivity_list;
enum dmx_frontend_source source;
};
成員
connectivity_list可以連線到特定解複用器的前端列表;
source前端的型別。
int dvb_dmx_init(struct dvb_demux *demux)¶
- FIXME:此結構可能很快會被基於媒體控制器的邏輯替換。
基於媒體控制器的邏輯。
-
enum dmx_demux_caps¶
MPEG-2 TS 解複用器功能點陣圖
常量
DMX_TS_FILTERING如果支援 TS 過濾,則設定;
DMX_SECTION_FILTERING如果支援節過濾,則設定;
DMX_MEMORY_BASED_FILTERING如果 write() 可用,則設定。
int dvb_dmx_init(struct dvb_demux *demux)¶
這些標誌在 dmx_demux.capabilities 欄位中進行 OR 運算
-
DMX_FE_ENTRY¶
DMX_FE_ENTRY (list)
將已註冊前端列表中的元素從通用型別 struct list_head 強制轉換為型別 *
struct dmx_frontend
引數
list
-
struct dmx_demux¶
包含解複用器功能和回撥的結構。
定義:
struct dmx_demux {
enum dmx_demux_caps capabilities;
struct dmx_frontend *frontend;
void *priv;
int (*open)(struct dmx_demux *demux);
int (*close)(struct dmx_demux *demux);
int (*write)(struct dmx_demux *demux, const char __user *buf, size_t count);
int (*allocate_ts_feed)(struct dmx_demux *demux,struct dmx_ts_feed **feed, dmx_ts_cb callback);
int (*release_ts_feed)(struct dmx_demux *demux, struct dmx_ts_feed *feed);
int (*allocate_section_feed)(struct dmx_demux *demux,struct dmx_section_feed **feed, dmx_section_cb callback);
int (*release_section_feed)(struct dmx_demux *demux, struct dmx_section_feed *feed);
int (*add_frontend)(struct dmx_demux *demux, struct dmx_frontend *frontend);
int (*remove_frontend)(struct dmx_demux *demux, struct dmx_frontend *frontend);
struct list_head *(*get_frontends)(struct dmx_demux *demux);
int (*connect_frontend)(struct dmx_demux *demux, struct dmx_frontend *frontend);
int (*disconnect_frontend)(struct dmx_demux *demux);
int (*get_pes_pids)(struct dmx_demux *demux, u16 *pids);
};
成員
capabilities功能標誌的位欄位。
frontend連線到解複用器的前端
priv指向 API 客戶端的私有資料的指標
open此函式為呼叫方保留解複用器,並在必要時初始化解複用器。不再需要解複用器時,應呼叫函式 close。多個客戶端應可以同時訪問解複用器。因此,函式實現應在呼叫 open 時遞增解複用器使用計數,並在呼叫 close 時遞減它。demux 函式引數包含指向解複用器 API 和例項資料的指標。它返回:成功時返回 0;達到最大使用計數時返回 -EUSERS;引數錯誤時返回 -EINVAL。
close此函式為呼叫方保留解複用器,並在必要時初始化解複用器。不再需要解複用器時,應呼叫函式 close。多個客戶端應可以同時訪問解複用器。因此,函式實現應在呼叫 open 時遞增解複用器使用計數,並在呼叫 close 時遞減它。demux 函式引數包含指向解複用器 API 和例項資料的指標。它返回:成功時返回 0;如果解複用器未使用(例如,沒有使用者),則返回 -ENODEV;引數錯誤時返回 -EINVAL。
write此函式向解複用器驅動程式提供包含 TS 資料包的記憶體緩衝區。解複用器驅動程式軟體將從記憶體讀取資料包,而不是從 DVB 前端接收 TS 資料包。具有活動 TS、PES 或節過濾器的此解複用器的任何客戶端都將透過解複用器回撥 API(請參閱 0)接收已過濾的資料。當緩衝區中的所有資料都被解複用器使用後,該函式將返回。解複用器硬體通常無法從記憶體讀取 TS。如果是這種情況,則必須完全在軟體中實現基於記憶體的過濾。demux 函式引數包含指向解複用器 API 和例項資料的指標。buf 函式引數包含指向核心空間記憶體中 TS 資料的指標。count 函式引數包含 TS 資料的長度。它返回:成功時返回 0;互斥鎖被中斷時返回 -ERESTARTSYS;有訊號處理掛起時返回 -EINTR;解複用器已移除時返回 -ENODEV;引數錯誤時返回 -EINVAL。
allocate_ts_feed分配新的 TS 饋送,該饋送用於過濾承載特定 PID 的 TS 資料包。TS 饋送通常對應於解複用器晶片上的硬體 PID 過濾器。demux 函式引數包含指向解複用器 API 和例項資料的指標。feed 函式引數包含指向 TS 饋送 API 和例項資料的指標。callback 函式引數包含指向用於傳遞接收到的 TS 資料包的回撥函式的指標。它返回:成功時返回 0;互斥鎖被中斷時返回 -ERESTARTSYS;如果沒有更多 TS 饋送可用,則返回 -EBUSY;引數錯誤時返回 -EINVAL。
release_ts_feed釋放使用 allocate_ts_feed 分配的資源。應在呼叫此函式之前停止 TS 饋送上的任何正在進行的過濾。demux 函式引數包含指向解複用器 API 和例項資料的指標。feed 函式引數包含指向 TS 饋送 API 和例項資料的指標。它返回:成功時返回 0;引數錯誤時返回 -EINVAL。
allocate_section_feed分配新的節饋送,即用於過濾和接收節的解複用器資源。在具有節過濾硬體支援的平臺上,節饋送直接對映到解複用器硬體。在其他平臺上,TS 資料包首先在硬體中進行 PID 過濾,然後在軟體中模擬硬體節過濾器。呼叫方獲取型別為 dmx_section_feed_t 的 API 指標作為輸出引數。使用此 API,呼叫方可以設定過濾引數並開始接收節。demux 函式引數包含指向解複用器 API 和例項資料的指標。feed 函式引數包含指向 TS 饋送 API 和例項資料的指標。callback 函式引數包含指向用於傳遞接收到的 TS 資料包的回撥函式的指標。它返回:成功時返回 0;如果沒有更多 TS 饋送可用,則返回 -EBUSY;引數錯誤時返回 -EINVAL。
release_section_feed釋放使用 allocate_section_feed 分配的資源,包括分配的過濾器。應在呼叫此函式之前停止節饋送上的任何正在進行的過濾。demux 函式引數包含指向解複用器 API 和例項資料的指標。feed 函式引數包含指向 TS 饋送 API 和例項資料的指標。它返回:成功時返回 0;引數錯誤時返回 -EINVAL。
add_frontend註冊解複用器和前端之間的連線,即指示可以透過呼叫 connect_frontend 連線解複用器,以將給定的前端用作 TS 源。此函式的客戶端必須為前端結構分配動態或靜態記憶體,並在呼叫此函式之前初始化其欄位。通常在驅動程式初始化期間呼叫此函式。在成功呼叫 remove_frontend 之前,呼叫方不得釋放前端結構的記憶體。demux 函式引數包含指向解複用器 API 和例項資料的指標。frontend 函式引數包含指向前端例項資料的指標。它返回:成功時返回 0;引數錯誤時返回 -EINVAL。
remove_frontend指示給定前端(透過呼叫 add_frontend 註冊)不再可以作為此解複用器的 TS 源連線。從系統中移除前端驅動程式或解複用器驅動程式時,應呼叫該函式。如果正在使用前端,則函式將失敗並返回 -EBUSY。成功呼叫此函式後,如果之前在 add_frontend 操作之前動態分配了前端結構的記憶體,則呼叫方可以釋放該記憶體。demux 函式引數包含指向解複用器 API 和例項資料的指標。frontend 函式引數包含指向前端例項資料的指標。它返回:成功時返回 0;如果未找到前端,則返回 -ENODEV,引數錯誤時返回 -EINVAL。
get_frontends提供已為此解複用器註冊的前端的 API。透過此呼叫獲得的任何前端都可以用作 connect_frontend 的引數。包含檔案 demux.h 包含宏
DMX_FE_ENTRY(),用於將通用型別 structlist_head* 的元素轉換為型別 structdmx_frontend*。呼叫方不得釋放透過此函式呼叫獲得的任何元素的記憶體。**demux** 函式引數包含指向解複用器 API 和例項資料的指標。它返回指向前端介面列表的 struct list_head 指標,如果列表為空,則返回 NULL。connect_frontend將前端的 TS 輸出連線到解複用器的輸入。解複用器只能連線到使用函式 add_frontend 註冊到解複用器的前端。根據硬體平臺的功能,可以將多個解複用器連線到同一前端,也可能無法連線。不使用時,應透過呼叫 disconnect_frontend 來釋放前端。demux 函式引數包含指向解複用器 API 和例項資料的指標。frontend 函式引數包含指向前端例項資料的指標。它返回:成功時返回 0;引數錯誤時返回 -EINVAL。
disconnect_frontend斷開解複用器和先前透過 connect_frontend 呼叫連線的前端。demux 函式引數包含指向解複用器 API 和例項資料的指標。它返回:成功時返回 0;引數錯誤時返回 -EINVAL。
get_pes_pids獲取 DMX_PES_AUDIO0、DMX_PES_VIDEO0、DMX_PES_TELETEXT0、DMX_PES_SUBTITLE0 和 DMX_PES_PCR0 的 PID。demux 函式引數包含指向解複用器 API 和例項資料的指標。pids 函式引數包含一個包含五個 u16 元素的陣列,PID 將儲存在其中。它返回:成功時返回 0;引數錯誤時返回 -EINVAL。