/***************************************************************************** * dvb_gen_si.c: Generate SI tables and descriptors ***************************************************************************** * Copyright (c) 2011 Unix Solutions Ltd. * Copyright (c) 2015 VideoLAN * * Authors: * Georgi Chorbadzhiyski * Christophe Massiot * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject * to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include uint16_t tsid = 10000; uint16_t sid = 20000; uint16_t event_id = 30000; uint16_t onid = 40000; uint16_t pmt_pid = 100; uint16_t scte35_pid = 200; time_t ts_0 = 1234567890; time_t ts_1 = 1; time_t ts_2 = 999999999; time_t ts_3 = 0x7fffffff; uint8_t cc = 0; /* ========================================================================= * MPEG defined descriptors * ========================================================================= */ /* MPEG Descriptor 0x02: Video stream descriptor */ static void build_desc02_1(uint8_t *desc) { desc02_init(desc); desc02_set_multiple_frame_rate (desc, true); desc02_set_frame_rate_code (desc, 3); // 25.00 desc02_set_mpeg1_only_flag (desc, true); desc02_set_constraint_parameter(desc, true); desc02_set_still_picture (desc, true); } static void build_desc02_2(uint8_t *desc) { desc02_init(desc); desc02_set_multiple_frame_rate (desc, true); desc02_set_frame_rate_code (desc, 4); // 29.97 desc02_set_mpeg1_only_flag (desc, false); // Allow more flags desc02_set_constraint_parameter(desc, true); desc02_set_still_picture (desc, true); desc02_set_profile (desc, 4); // Main desc02_set_level (desc, 8); // Main desc02_set_chroma_format (desc, 2); // 4:2:2 desc02_set_frame_rate_extension(desc, false); } /* MPEG Descriptor 0x03: Audio stream descriptor */ static void build_desc03(uint8_t *desc) { desc03_init(desc); desc03_set_free_format_flag(desc, true); desc03_set_ID(desc, true); desc03_set_layer(desc, 2); // Layer II desc03_set_vbr_flag(desc, true); } /* MPEG Descriptor 0x04: Hierarchy descriptor */ static void build_desc04(uint8_t *desc) { desc04_init(desc); desc04_set_type(desc, 1); desc04_set_layer_index(desc, 6); desc04_set_embedded_layer_index(desc, 7); desc04_set_channel(desc, 8); } /* MPEG Descriptor 0x05: Registration descriptor */ static void build_desc05(uint8_t *desc) { desc05_init(desc); desc05_set_identifier(desc, (uint8_t *)"TEST"); } /* MPEG Descriptor 0x06: Data stream alignment descriptor */ static void build_desc06(uint8_t *desc) { desc06_init(desc); desc06_set_alignment(desc, 2); // Video access unit } /* MPEG Descriptor 0x07: Target Background Grid descriptor */ static void build_desc07(uint8_t *desc) { desc07_init(desc); desc07_set_horizontal_size(desc, 720); desc07_set_vertical_size(desc, 576); desc07_set_aspect_ratio_info(desc, 7); } /* MPEG Descriptor 0x08: Video Window descriptor */ static void build_desc08(uint8_t *desc) { desc08_init(desc); desc08_set_horizontal_offset(desc, 1024); desc08_set_vertical_offset(desc, 768); desc08_set_window_priority(desc, 15); } /* MPEG Descriptor 0x09: Conditional access descriptor */ static void build_desc09(uint8_t *desc) { desc09_init(desc); desc09_set_sysid(desc, 0xb000); desc09_set_pid(desc, 1234); } /* MPEG Descriptor 0x0A: ISO-639 language descriptor */ static void build_desc0a(uint8_t *desc) { uint8_t k = 0; uint8_t *lang_n; desc0a_init(desc); desc_set_length(desc, 255); lang_n = desc0a_get_language(desc, k++); desc0an_set_code(lang_n, (uint8_t *)"eng"); desc0an_set_audiotype(lang_n, 0); lang_n = desc0a_get_language(desc, k++); desc0an_set_code(lang_n, (uint8_t *)"eng"); desc0an_set_audiotype(lang_n, 1); lang_n = desc0a_get_language(desc, k++); desc0an_set_code(lang_n, (uint8_t *)"eng"); desc0an_set_audiotype(lang_n, 2); lang_n = desc0a_get_language(desc, k++); desc0an_set_code(lang_n, (uint8_t *)"eng"); desc0an_set_audiotype(lang_n, 3); lang_n = desc0a_get_language(desc, k++); desc0an_set_code(lang_n, (uint8_t *)"bul"); desc0an_set_audiotype(lang_n, 4); lang_n = desc0a_get_language(desc, k++); desc0an_set_code(lang_n, (uint8_t *)"bul"); desc0an_set_audiotype(lang_n, 0); lang_n = desc0a_get_language(desc, k); desc_set_length(desc, lang_n - desc - DESC_HEADER_SIZE); } /* MPEG Descriptor 0x0B: System clock descriptor */ static void build_desc0b(uint8_t *desc) { desc0b_init(desc); desc0b_set_external_clock_reference_indicator(desc, true); desc0b_set_clock_accuracy_integer(desc, 60); desc0b_set_clock_accuracy_exponent(desc, 4); } /* MPEG Descriptor 0x0C: Multiplex buffer utilization descriptor */ static void build_desc0c(uint8_t *desc) { desc0c_init(desc); desc0c_set_bound_valid(desc, true); desc0c_set_LTW_offset_lower_bound(desc, 1234); desc0c_set_LTW_offset_upper_bound(desc, 5678); } /* MPEG Descriptor 0x0D: Copyright descriptor */ static void build_desc0d(uint8_t *desc) { desc0d_init(desc); desc0d_set_copyright_identifier(desc, 0x12345678); desc0d_set_additional_copyright_info(desc, (uint8_t *)"ABCD", 4); } /* MPEG Descriptor 0x0E: Maximum bitrate descriptor */ static void build_desc0e(uint8_t *desc) { desc0e_init(desc); desc0e_set_max_bitrate(desc, 123456); } /* MPEG Descriptor 0x0F: Private data indicator descriptor */ static void build_desc0f(uint8_t *desc) { desc0f_init(desc); desc0f_set_private_indicator(desc, 0xaabbccdd); } /* MPEG Descriptor 0x10: Smoothing buffer descriptor */ static void build_desc10(uint8_t *desc) { desc10_init(desc); desc10_set_sb_leak_rate(desc, 112233); desc10_set_sb_size(desc, 4112233); } /* MPEG Descriptor 0x11: STD descriptor */ static void build_desc11(uint8_t *desc) { desc11_init(desc); desc11_set_leak_valid_flag(desc, true); } /* MPEG Descriptor 0x12: IBP descriptor */ static void build_desc12(uint8_t *desc) { desc12_init(desc); desc12_set_closed_gop_flag(desc, true); desc12_set_identical_gop_flag(desc, false); desc12_set_max_gop_length(desc, 5000); } /* MPEG Descriptor 0x1b: MPEG4 Video descriptor */ static void build_desc1b(uint8_t *desc) { desc1b_init(desc); desc1b_set_mpeg4_visual_profile_and_level(desc, 0x12); } /* MPEG Descriptor 0x1c: MPEG4 Audio descriptor */ static void build_desc1c(uint8_t *desc) { desc1c_init(desc); desc1c_set_mpeg4_audio_profile_and_level(desc, 0x13); } /* MPEG Descriptor 0x1d: IOD descriptor */ static void build_desc1d(uint8_t *desc) { desc1d_init(desc); desc1d_set_scope(desc, 0x01); desc1d_set_iod_label(desc, 0x23); desc1d_set_iod(desc, 0x45); } /* MPEG Descriptor 0x1e: SL descriptor */ static void build_desc1e(uint8_t *desc) { desc1e_init(desc); desc1e_set_es_id(desc, 0x1234); } /* MPEG Descriptor 0x1f: FMC descriptor */ static void build_desc1f(uint8_t *desc) { uint8_t k = 0; uint8_t *entry_n; desc1f_init(desc); desc_set_length(desc, 255); entry_n = desc1f_get_entry(desc, k++); desc1fn_set_es_id(entry_n, 0x1122); desc1fn_set_flexmux_channel(entry_n, 0x33); entry_n = desc1f_get_entry(desc, k++); desc1fn_set_es_id(entry_n, 0x4455); desc1fn_set_flexmux_channel(entry_n, 0x66); entry_n = desc1f_get_entry(desc, k++); desc1fn_set_es_id(entry_n, 0x7788); desc1fn_set_flexmux_channel(entry_n, 0x99); entry_n = desc1f_get_entry(desc, k); desc_set_length(desc, entry_n - desc - DESC_HEADER_SIZE); } /* MPEG Descriptor 0x20: External ES_ID descriptor */ static void build_desc20(uint8_t *desc) { desc20_init(desc); desc20_set_external_es_id(desc, 0x1234); } /* MPEG Descriptor 0x21: MuxCode descriptor */ static void build_desc21(uint8_t *desc) { uint8_t n = 0, k = 0, r; uint8_t *entry_n, *entry_k; desc21_init(desc); desc_set_length(desc, 255); entry_n = desc21_get_entry(desc, n++); desc21n_set_muxcode(entry_n, 1); desc21n_set_version(entry_n, 1); desc21n_set_length(entry_n, DESC21_ENTRY_HEADER_SIZE - 1); desc21n_set_substruct_count(entry_n, 0); entry_n = desc21_get_entry(desc, n++); desc21n_set_muxcode(entry_n, 2); desc21n_set_version(entry_n, 2); desc21n_set_length(entry_n, 255); desc21n_set_substruct_count(entry_n, 255); { k = 0; entry_k = desc21n_get_substruct(entry_n, k++); desc21k_set_repetition_count(entry_k, 1); desc21k_set_slot_count(entry_k, 0); entry_k = desc21n_get_substruct(entry_n, k++); desc21k_set_repetition_count(entry_k, 5); desc21k_set_slot_count(entry_k, 5); for (r=0; r