/***************************************************************************** * dvbpsi_GenServiceListDr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_GenServiceListDr( dvbpsi_service_list_dr_t * p_decoded, bool b_duplicate) { /* Check the length */ if (p_decoded->i_service_count > 63) return NULL; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x41, p_decoded->i_service_count*3, NULL); if (!p_descriptor) return NULL; /* Encode data */ for (uint8_t i = 0; i < p_decoded->i_service_count; i++) { p_descriptor->p_data[i*3] = p_decoded->i_service[i].i_service_id >> 8; p_descriptor->p_data[i*3+1] = p_decoded->i_service[i].i_service_id; p_descriptor->p_data[i*3+2] = p_decoded->i_service[i].i_service_type; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_service_list_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_gen_dvb_nvod_ref_dr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_gen_dvb_nvod_ref_dr(dvbpsi_dvb_nvod_ref_dr_t * p_decoded, bool b_duplicate) { /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x4b, p_decoded->i_references * 6, NULL); if (!p_descriptor) return NULL; if (p_decoded->i_references > 43) p_decoded->i_references = 43; /* Encode data */ int pos = 0; for (int i = 0; i < p_decoded->i_references; i++ ) { p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_transport_stream_id >> 8; p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_transport_stream_id; p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_original_network_id >> 8; p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_original_network_id; p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_service_id >> 8; p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_service_id; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_dvb_nvod_ref_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenISO639Dr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_GenISO639Dr(dvbpsi_iso639_dr_t * p_decoded, bool b_duplicate) { if (p_decoded->i_code_count > 64) p_decoded->i_code_count = 64; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x0a, p_decoded->i_code_count * 4, NULL); if (!p_descriptor) return NULL; /* Encode data */ int i = 0; while( i < p_decoded->i_code_count ) { p_descriptor->p_data[i*4] = p_decoded->code[i].iso_639_code[0]; p_descriptor->p_data[i*4+1] = p_decoded->code[i].iso_639_code[1]; p_descriptor->p_data[i*4+2] = p_decoded->code[i].iso_639_code[2]; p_descriptor->p_data[i*4+3] = p_decoded->code[i].i_audio_type; i++; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_iso639_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenCADr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_GenCADr(dvbpsi_ca_dr_t * p_decoded, bool b_duplicate) { if (p_decoded->i_private_length > 251) p_decoded->i_private_length = 251; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x09, p_decoded->i_private_length + 4, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = p_decoded->i_ca_system_id >> 8; p_descriptor->p_data[1] = p_decoded->i_ca_system_id; p_descriptor->p_data[2] = 0xe0 | ((p_decoded->i_ca_pid >> 8) & 0x1f); p_descriptor->p_data[3] = p_decoded->i_ca_pid; if (p_decoded->i_private_length) memcpy(p_descriptor->p_data + 4, p_decoded->i_private_data, p_decoded->i_private_length); if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_ca_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenComponentDr *****************************************************************************/ dvbpsi_descriptor_t *dvbpsi_GenComponentDr(dvbpsi_component_dr_t * p_decoded, bool b_duplicate) { /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x50, 6+p_decoded->i_text_length, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = p_decoded->i_stream_content+0xF0; p_descriptor->p_data[1] = p_decoded->i_component_type; p_descriptor->p_data[2] = p_decoded->i_component_tag; memcpy( &p_descriptor->p_data[3], p_decoded->i_iso_639_code, 3 ); if (p_decoded->i_text_length) memcpy(&p_descriptor->p_data[6],p_decoded->i_text,p_decoded->i_text_length); if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_component_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_gen_mpeg_private_data_dr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_gen_mpeg_private_data_dr( dvbpsi_mpeg_private_data_dr_t * p_decoded, bool b_duplicate) { /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x0f, 4, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = p_decoded->i_private_data >> 24; p_descriptor->p_data[1] = p_decoded->i_private_data >> 16; p_descriptor->p_data[2] = p_decoded->i_private_data >> 8; p_descriptor->p_data[3] = p_decoded->i_private_data; if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_mpeg_private_data_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenCAIdentifierDr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_GenCAIdentifierDr(dvbpsi_ca_identifier_dr_t *p_decoded, bool b_duplicate) { if (p_decoded->i_number > DVBPSI_CA_SYSTEM_ID_DR_MAX) p_decoded->i_number = DVBPSI_CA_SYSTEM_ID_DR_MAX; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x53, p_decoded->i_number * 2, NULL); if (!p_descriptor) return NULL; /* Encode data */ for (int i = 0; i < p_decoded->i_number; i++ ) { p_descriptor->p_data[2 * i] = p_decoded->p_system[i].i_ca_system_id >> 8; p_descriptor->p_data[2 * i + 1] = p_decoded->p_system[i].i_ca_system_id; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_ca_identifier_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_gen_mpeg_iso639_dr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_gen_mpeg_iso639_dr(dvbpsi_mpeg_iso639_dr_t * p_decoded, bool b_duplicate) { if (p_decoded->i_code_count > 64) p_decoded->i_code_count = 64; /* Create the descriptor */ uint8_t i_size = (p_decoded->i_code_count * 4) > UINT8_MAX ? 255 : p_decoded->i_code_count * 4; dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x0a, i_size, NULL); if (!p_descriptor) return NULL; /* Encode data */ int i = 0; while( i < p_decoded->i_code_count ) { p_descriptor->p_data[i*4] = p_decoded->code[i].iso_639_code[0]; p_descriptor->p_data[i*4+1] = p_decoded->code[i].iso_639_code[1]; p_descriptor->p_data[i*4+2] = p_decoded->code[i].iso_639_code[2]; p_descriptor->p_data[i*4+3] = p_decoded->code[i].i_audio_type; i++; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_mpeg_iso639_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_gen_dvb_country_availability_dr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_gen_dvb_country_availability_dr( dvbpsi_dvb_country_availability_dr_t * p_decoded, bool b_duplicate) { /* Check the length */ if (p_decoded->i_code_count > 83) return NULL; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x83, 1+p_decoded->i_code_count*3, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = (p_decoded->b_country_availability_flag) ? 0x80: 0x00; for (uint8_t i = 0; i < p_decoded->i_code_count; i++) { p_descriptor->p_data[1+i*3] = p_decoded->code[i].iso_639_code[0]; p_descriptor->p_data[2+i*3] = p_decoded->code[i].iso_639_code[1]; p_descriptor->p_data[3+i*3] = p_decoded->code[i].iso_639_code[2]; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_dvb_country_availability_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenNetworkNameDr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_GenNetworkNameDr( dvbpsi_network_name_dr_t * p_decoded, bool b_duplicate) { if (p_decoded->i_name_length > 255) p_decoded->i_name_length = 255; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x40, p_decoded->i_name_length, NULL); if (!p_descriptor) return NULL; /* Encode data */ if (p_decoded->i_name_length) memcpy(p_descriptor->p_data, p_decoded->i_name_byte, p_decoded->i_name_length); if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_network_name_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_gen_dvb_subtitling_dr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_gen_dvb_subtitling_dr( dvbpsi_dvb_subtitling_dr_t * p_decoded, bool b_duplicate) { if (p_decoded->i_subtitles_number > DVBPSI_SUBTITLING_DR_MAX) p_decoded->i_subtitles_number = DVBPSI_SUBTITLING_DR_MAX; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x59, p_decoded->i_subtitles_number * 8 , NULL); if (!p_descriptor) return NULL; /* Encode data */ for (int i = 0; i < p_decoded->i_subtitles_number; i++ ) { memcpy( p_descriptor->p_data + 8 * i, p_decoded->p_subtitle[i].i_iso6392_language_code, 3); p_descriptor->p_data[8 * i + 3] = p_decoded->p_subtitle[i].i_subtitling_type; p_descriptor->p_data[8 * i + 4] = p_decoded->p_subtitle[i].i_composition_page_id >> 8; p_descriptor->p_data[8 * i + 5] = p_decoded->p_subtitle[i].i_composition_page_id & 0xFF; p_descriptor->p_data[8 * i + 6] = p_decoded->p_subtitle[i].i_ancillary_page_id >> 8; p_descriptor->p_data[8 * i + 7] = p_decoded->p_subtitle[i].i_ancillary_page_id & 0xFF; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_dvb_subtitling_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenParentalRatingDr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_GenParentalRatingDr( dvbpsi_parental_rating_dr_t * p_decoded, bool b_duplicate) { uint8_t i_length; if (p_decoded->i_ratings_number >= DVBPSI_PARENTAL_RATING_DR_MAX) { i_length = (DVBPSI_PARENTAL_RATING_DR_MAX - 1) * 4; p_decoded->i_ratings_number = DVBPSI_PARENTAL_RATING_DR_MAX; } else i_length = p_decoded->i_ratings_number * 4; /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x55, i_length, NULL); if (!p_descriptor) return NULL; /* Encode data */ for (int i = 0; i < p_decoded->i_ratings_number; i++ ) { p_descriptor->p_data[4 * i] = p_decoded->p_parental_rating[i].i_country_code >> 16; p_descriptor->p_data[4 * i + 1] = (p_decoded->p_parental_rating[i].i_country_code >> 8) & 0xff; p_descriptor->p_data[4 * i + 2] = p_decoded->p_parental_rating[i].i_country_code & 0xff; p_descriptor->p_data[4 * i + 3] = p_decoded->p_parental_rating[i].i_rating; } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_parental_rating_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenCUEIDr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_GenCUEIDr(dvbpsi_cuei_dr_t * p_decoded, bool b_duplicate) { /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x8a, 0x01, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = p_decoded->i_cue_stream_type; if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_cuei_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_gen_dvb_terr_deliv_sys_dr *****************************************************************************/ dvbpsi_descriptor_t * dvbpsi_gen_dvb_terr_deliv_sys_dr( dvbpsi_dvb_terr_deliv_sys_dr_t * p_decoded, bool b_duplicate) { /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x5a, 11, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = (p_decoded->i_centre_frequency >> 24) & 0xff; p_descriptor->p_data[1] = (p_decoded->i_centre_frequency >> 16) & 0xff; p_descriptor->p_data[2] = (p_decoded->i_centre_frequency >> 8) & 0xff; p_descriptor->p_data[3] = p_decoded->i_centre_frequency & 0xff; p_descriptor->p_data[4] = (p_decoded->i_bandwidth & 0x07) << 5 | (p_decoded->i_priority & 0x01) << 4 | (p_decoded->i_time_slice_indicator & 0x01) << 3 | (p_decoded->i_mpe_fec_indicator & 0x01) << 2 | 0x03; p_descriptor->p_data[5] = (p_decoded->i_constellation & 0x03) << 6 | (p_decoded->i_hierarchy_information & 0x07) << 3 | (p_decoded->i_code_rate_hp_stream & 0x07); p_descriptor->p_data[6] = (p_decoded->i_code_rate_lp_stream & 0x07) << 5 | (p_decoded->i_guard_interval & 0x03) << 3 | (p_decoded->i_transmission_mode & 0x03) << 1 | (p_decoded->i_other_frequency_flag & 0x01); p_descriptor->p_data[7] = 0xff; p_descriptor->p_data[8] = 0xff; p_descriptor->p_data[9] = 0xff; p_descriptor->p_data[10] = 0xff; if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_dvb_terr_deliv_sys_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenServiceLocationDr *****************************************************************************/ dvbpsi_descriptor_t* dvbpsi_GenServiceLocationDr( dvbpsi_service_location_dr_t* p_decoded, bool b_duplicate) { if (p_decoded->i_number_elements > 42) p_decoded->i_number_elements = 42; uint8_t i_desc_length = 3 + p_decoded->i_number_elements * 6; dvbpsi_descriptor_t* p_descriptor = dvbpsi_NewDescriptor(0xa1, i_desc_length, NULL); if (!p_descriptor) return NULL; uint8_t* p_data = p_descriptor->p_data; p_data[0] = p_decoded->i_pcr_pid >> 8; p_data[1] = p_decoded->i_pcr_pid; p_data[2] = p_decoded->i_number_elements; p_data += 3; for (uint8_t i = 0; i < p_decoded->i_number_elements; ++i) { dvbpsi_service_location_element_t p_es = p_decoded->elements[i]; uint8_t* p_es_data = p_data; p_es_data[0] = p_es.i_stream_type; p_es_data[1] = p_es.i_elementary_pid >> 8; p_es_data[2] = p_es.i_elementary_pid; p_es_data[3] = p_es.i_iso_639_code[0]; p_es_data[4] = p_es.i_iso_639_code[1]; p_es_data[5] = p_es.i_iso_639_code[2]; p_data += 6; } if (b_duplicate) { p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_service_location_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenTimeShiftedEventDr *****************************************************************************/ dvbpsi_descriptor_t *dvbpsi_GenTimeShiftedEventDr(dvbpsi_tshifted_ev_dr_t * p_decoded, bool b_duplicate) { /* Create the descriptor */ dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x4f, 4, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = p_decoded->i_ref_service_id >> 8; p_descriptor->p_data[1] = p_decoded->i_ref_service_id; p_descriptor->p_data[2] = p_decoded->i_ref_event_id >> 8; p_descriptor->p_data[3] = p_decoded->i_ref_event_id; if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_tshifted_ev_dr_t)); } return p_descriptor; }
/***************************************************************************** * dvbpsi_GenAACDr *****************************************************************************/ dvbpsi_descriptor_t *dvbpsi_GenAACDr(dvbpsi_aac_dr_t *p_decoded, bool b_duplicate) { /* Create the descriptor */ uint8_t i_length = p_decoded->b_type ? 3 + p_decoded->i_additional_info_length : 1; dvbpsi_descriptor_t *p_descriptor = dvbpsi_NewDescriptor(0x7c, i_length, NULL); if (!p_descriptor) return NULL; /* Encode data */ p_descriptor->p_data[0] = dvbpsi_aac_profile_and_level_to_hex(p_decoded->i_profile_and_level); if (p_descriptor->i_length > 1) { p_descriptor->p_data[1] = 0x00; p_descriptor->p_data[1] |= ((p_decoded->b_type ? 1: 0) << 7); } if (p_decoded->b_type) p_descriptor->p_data[2] = dvbpsi_aac_type_to_hex(p_decoded->i_type); /* Store additional info bytes field */ if (p_descriptor->i_length > 1) { uint8_t *p = &p_descriptor->p_data[p_decoded->b_type ? 3 : 2]; memcpy(&p, p_decoded->p_additional_info, p_decoded->i_additional_info_length); } if (b_duplicate) { /* Duplicate decoded data */ p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded, sizeof(dvbpsi_aac_dr_t)); } return p_descriptor; }