📄 dvb_descriptor.c
字号:
b += d.service_provider_name_length; d.service_name_length = getBits (b, 0, 0, 8); b += 1; out_SW_NL (5,"Service_name_length: ",d.service_name_length); print_text_468A (4, "Service_name: ", b,d.service_name_length); }/* 0x49 Country Availibility descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_CountryAvail (u_char *b){ typedef struct _descCountryAvail { u_int descriptor_tag; u_int descriptor_length; u_int country_availability_flag; u_int reserved_1; // N countrycodes[3] } descCountryAvail; descCountryAvail d; int len; u_char country_code[4]; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; d.country_availability_flag = getBits (b, 0, 16, 1); d.reserved_1 = getBits (b, 0, 17, 7); out_SB_NL (4,"country_availability_flag: ",d.country_availability_flag); out_SB_NL (6,"reserved_1: ",d.reserved_1); b += 3; len = d.descriptor_length - 1; indent (+1); while (len > 0) { strncpy (country_code, b, 3); *(country_code+3) = '\0'; b += 3; len -= 3; out_nl (4,"Country: %3.3s",country_code); } indent (-1);}/* 0x4A Linkage descriptor */void descriptorDVB_Linkage (u_char *b){ /* ETSI 300 468 6.2.xx */ typedef struct _descLinkage { u_int descriptor_tag; u_int descriptor_length; u_int transport_stream_id; u_int original_network_id; u_int service_id; u_int linkage_type; } descLinkage; descLinkage d; int len; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; d.transport_stream_id = getBits (b, 0, 16, 16); d.original_network_id = getBits (b, 0, 32, 16); d.service_id = getBits (b, 0, 48, 16); d.linkage_type = getBits (b, 0, 64, 8); out_SW_NL (4,"Transport_stream_ID: ",d.transport_stream_id); out_S2W_NL (4,"Original_network_ID: ",d.original_network_id, dvbstrOriginalNetwork_ID(d.original_network_id)); out_S2W_NL (4,"Service_ID: ",d.service_id, " --> refers to PMS program_number"); out_S2B_NL (4,"Linkage_type: ",d.linkage_type, dvbstrLinkage_TYPE (d.linkage_type)); len = d.descriptor_length - 7; b += 7 + 2; indent (+1); if (d.linkage_type == 0x08) { /* EN 300 468 */ sub_descriptorDVB_Linkage0x08 (b, len); } else if (d.linkage_type == 0x09) { /* TR 102 006 DSM-CC */ sub_descriptorDVB_Linkage0x09 (b, len); } else if (d.linkage_type == 0x0A) { /* TR 102 006 DSM-CC */ /* SSU SCAN Linkage */ outBit_S2x_NL (4,"Table_type: ", b, 0, 8, (char *(*)(u_long))dsmccStrLinkage0CTable_TYPE ); } else if (d.linkage_type == 0x0B) { /* EN 301 192 DSM-CC */ sub_descriptorDVB_Linkage0x0B (b, len); } else if (d.linkage_type == 0x0C) { /* EN 301 192 DSM-CC */ sub_descriptorDVB_Linkage0x0C (b, len); } else { print_private_data (4, b,len); } indent (-1);}/* * DVB Linkage Subdescriptor 0x08 */void sub_descriptorDVB_Linkage0x08 (u_char *b, int len){ /* ETSI 300 468 6.2.xx */ typedef struct _descLinkage0x08 { u_int handover_type; u_int reserved_1; u_int origin_type; u_int network_id; u_int initial_service_id; } descLinkage0x08; descLinkage0x08 d; d.handover_type = getBits (b, 0, 0, 4); d.reserved_1 = getBits (b, 0, 4, 3); d.origin_type = getBits (b, 0, 7, 1); b += 1; len -= 1; out_S2B_NL (4,"Handover_type: ",d.handover_type, dvbstrHandover_TYPE(d.handover_type)); out_SB_NL (6,"reserved_1: ",d.reserved_1); out_S2B_NL (4,"Origin_type: ",d.origin_type, dvbstrOrigin_TYPE(d.origin_type)); if ( d.handover_type == 0x01 || d.handover_type == 0x02 || d.handover_type == 0x03) { d.network_id = getBits (b, 0, 0, 16); out_S2W_NL (4,"Network_ID: ",d.network_id, dvbstrNetworkIdent_ID(d.network_id)); b += 1; len -= 1; } if (d.origin_type == 0x00) { d.initial_service_id = getBits (b, 0, 0, 16); out_SW_NL (4,"Initial_service_ID: ",d.initial_service_id); b += 1; len -= 1; } if (len > 0) { print_private_data (4, b,len); }}/* * DVB Linkage Subdescriptor 0x09 */void sub_descriptorDVB_Linkage0x09 (u_char *b, int len){ /* ETSI TR 102 006 6.1 */ int OUI_data_length; u_long OUI; int selector_length; OUI_data_length = outBit_Sx_NL (4,"OUI_data_length: ", b,0,8); b++; len --; while (OUI_data_length > 0) { OUI = outBit_S2x_NL (4,"OUI: ", b, 0,24, (char *(*)(u_long))dsmccStrOUI ); b += 3; OUI_data_length -= 3; len -= 3; // the following is special to Premiere DSM-CC to prevent segfaults // Premiere seems to set short OUI_data_length if (OUI_data_length <= 0) continue; selector_length = outBit_Sx_NL (4,"selector_length: ", b, 0, 8); print_databytes (4,"Selector Bytes:", b+1,selector_length); b += (selector_length +1); // +1 = length byte OUI_data_length -= (selector_length +1); len -= (selector_length +1); } if (len > 0) { print_private_data (4, b,len); }}/* * -- as defined as private data for DSM-CC * -- in EN 301 192 */void sub_descriptorDVB_Linkage0x0B (u_char *b, int len) /* $$$ TODO */{ typedef struct _descLinkage0x0B { u_int platform_id_data_length; // inner Loop 1 u_long platform_id; u_int platform_name_loop_length; // inner Loop 2 u_char ISO639_2_language_code[4]; u_int platform_name_length; } descLinkage0x0B; descLinkage0x0B d; int len_loop1; d.platform_id_data_length = b[0]; out_SB_NL (4,"Platform_ID_data_length: ",d.platform_id_data_length); len_loop1 = d.platform_id_data_length; b++; len--; indent (+1); while (len_loop1 > 0) { int len_loop2; d.platform_id = getBits (b, 0, 0, 24); d.platform_name_loop_length = getBits (b, 0, 24, 8); b += 4; len -= 4; out_S2T_NL (4,"Platform_id: ",d.platform_id, dsmccStrPlatform_ID (d.platform_id)); out_SB_NL (4,"Platform_name_loop_length: ",d.platform_name_loop_length); len_loop1 -= 4; len_loop2 = d.platform_name_loop_length; indent (+1); while (len_loop2 > 0) { getISO639_3 (d.ISO639_2_language_code, b); out_nl (4," ISO639_language_code: %3.3s", d.ISO639_2_language_code); d.platform_name_length = getBits (b, 0, 24, 8); print_text_468A (4, "Platform_name: ", b+4,d.platform_name_length); b += d.platform_name_length + 4; len -= d.platform_name_length + 4; len_loop2 -= d.platform_name_length + 4; out_NL (4); } indent (-1); len_loop1 -= d.platform_name_loop_length; } indent (-1); print_private_data (4, b,len);}void sub_descriptorDVB_Linkage0x0C (u_char *b, int len){ typedef struct _descLinkage0x0C { u_int table_id; // conditional u_int bouquet_id; } descLinkage0x0C; descLinkage0x0C d; d.table_id = getBits (b, 0, 0, 8); out_S2W_NL (4,"Table_id: ",d.table_id, dsmccStrLinkage0CTable_TYPE(d.table_id)); if (d.table_id == 2) { d.bouquet_id = getBits (b, 0, 8, 16); out_S2W_NL (4,"Bouquet_id: ",d.bouquet_id, dvbstrBouquetTable_ID (d.bouquet_id)); }}/* 0x4B NVOD Reference descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_NVOD_Reference (u_char *b){ typedef struct _descNVODRef { u_int descriptor_tag; u_int descriptor_length; // N ... Ref2 } descNVODRef; typedef struct _descNVODRef2 { u_int transport_stream_id; u_int original_network_id; u_int service_id; } descNVODRef2; descNVODRef d; descNVODRef2 d2; int len; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; b += 2; len = d.descriptor_length; indent (+1); while (len > 0) { d2.transport_stream_id = getBits (b, 0, 0, 16); d2.original_network_id = getBits (b, 0, 16, 16); d2.service_id = getBits (b, 0, 32, 16); len -= 6; b += 6; out_SW_NL (4,"Transport_stream_ID: ",d2.transport_stream_id); out_S2W_NL (4,"Original_network_ID: ",d2.original_network_id, dvbstrOriginalNetwork_ID(d2.original_network_id)); out_S2W_NL (4,"Service_ID: ",d2.service_id, " --> refers to PMS program_number"); out_NL (4); } indent (-1);}/* 0x4C Time Shifted Service descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_TimeShiftedService (u_char *b){ typedef struct _descTimShiftServ { u_int descriptor_tag; u_int descriptor_length; u_int reference_service_id; } descTimShiftServ; descTimShiftServ d; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; d.reference_service_id = getBits (b, 0, 16, 16); out_SW_NL (4,"Reference_service_ID: ",d.reference_service_id);}/* 0x4D Short Event descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_ShortEvent (u_char *b){ typedef struct _descShortEvent { u_int descriptor_tag; u_int descriptor_length; u_char ISO639_2_language_code[4]; u_int event_name_length; // N char event_name u_int text_length; // N2 char text char } descShortEvent; descShortEvent d; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; getISO639_3 (d.ISO639_2_language_code, b+2); out_nl (4," ISO639_2_language_code: %3.3s", d.ISO639_2_language_code); d.event_name_length = getBits (b, 5, 0, 8); b += 6; out_SB_NL (5,"Event_name_length: ",d.event_name_length); print_text_468A (4, "Event_name: ", b,d.event_name_length); b += d.event_name_length; d.text_length = getBits (b, 0, 0, 8); b += 1; out_SB_NL (5,"Text_length: ",d.text_length); print_text_468A (4, "Text: ", b,d.text_length);}/* 0x4E Extended Event descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_ExtendedEvent (u_char *b){ typedef struct _descExtendedEvent { u_int descriptor_tag; u_int descriptor_length; u_int descriptor_number; u_int last_descriptor_number; u_char ISO639_2_language_code[4]; u_int length_of_items; // N Ext. Events List u_int text_length; // N4 char text char } descExtendedEvent; typedef struct _descExtendedEvent2 { u_int item_description_length; // N2 descriptors u_int item_length; // N3 chars } descExtendedEvent2; descExtendedEvent d; descExtendedEvent2 d2; int len1, lenB; d.descriptor_tag = b[0]; d.descriptor_length = b[1]; d.descriptor_number = getBits (b, 0, 16, 4); d.last_descriptor_number = getBits (b, 0, 20, 4); getISO639_3 (d.ISO639_2_language_code, b+3); d.length_of_items = getBits (b, 0, 48, 8); out_SB_NL (4,"Descriptor_number: ",d.descriptor_number); out_SB_NL (4,"Last_descriptor_number: ",d.last_descriptor_number); out_nl (4,"ISO639_2_language_code: %3.3s", d.ISO639_2_language_code); out_SB_NL (5,"Length_of_items: ",d.length_of_items); b += 7; lenB = d.descriptor_length - 5; len1 = d.length_of_items; indent (+1); while (len1 > 0) { d2.item_description_length = getBits (b, 0, 0, 8); out_NL (4); out_SB_NL (5,"Item_description_length: ",d2.item_description_length); print_text_468A (4, "Item_description: ", b+1, d2.item_description_length); b += 1 + d2.item_description_length; d2.item_length = getBits (b, 0, 0, 8); out_SB_NL (5,"Item_length: ",d2.item_length); print_text_468A (4, "Item: ", b+1, d2.item_length); b += 1 + d2.item_length; len1 -= (2 + d2.item_description_length + d2.item_length); lenB -= (2 + d2.item_description_length + d2.item_length); } out_NL (4); indent (-1); d.text_length = getBits (b, 0, 0, 8); b += 1; lenB -= 1; out_SB_NL (5,"Text_length: ",d.text_length); print_text_468A (4, "Text: ", b,d.text_length);}/* 0x4F Time Shifted Event descriptor ETSI EN 300 468 6.2.xx*/void descriptorDVB_TimeShiftedEvent (u_char *b){ typedef struct _descTimeShiftedEvent { u_int descriptor_tag; u_int descriptor_length; u_int reference_service_id; u_int reference_event_id;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -