Lines Matching +full:psi +full:- +full:l

1 // SPDX-License-Identifier: GPL-2.0
3 * This file contains the logic to work with MPEG Program-Specific Information.
4 * These are defined both in ISO/IEC 13818-1 (systems) and ETSI EN 300 468.
5 * PSI is carried in the form of table structures, and although each table might
84 while (len--) in dvb_crc32()
91 h->version++; in vidtv_psi_update_version_num()
100 return be16_to_cpu(h->bitfield) & mask; in vidtv_psi_get_sec_len()
109 return be16_to_cpu(p->bitfield) & mask; in vidtv_psi_get_pat_program_pid()
118 return be16_to_cpu(s->bitfield) & mask; in vidtv_psi_pmt_stream_get_elem_pid()
141 new = cpu_to_be16((be16_to_cpu(h->bitfield) & mask) | new_len); in vidtv_psi_set_sec_len()
149 h->bitfield = new; in vidtv_psi_set_sec_len()
153 * Packetize PSI sections into TS packets:
162 .bitfield = cpu_to_be16((args->new_psi_section << 14) | args->pid), in vidtv_psi_ts_psi_write_into()
167 u32 nbytes_past_boundary = (args->dest_offset % TS_PACKET_LEN); in vidtv_psi_ts_psi_write_into()
169 u32 remaining_len = args->len; in vidtv_psi_ts_psi_write_into()
174 if (!args->crc && !args->is_crc) in vidtv_psi_ts_psi_write_into()
177 if (args->crc) in vidtv_psi_ts_psi_write_into()
178 *args->crc = dvb_crc32(*args->crc, args->from, args->len); in vidtv_psi_ts_psi_write_into()
180 if (args->new_psi_section && !aligned) { in vidtv_psi_ts_psi_write_into()
181 pr_warn_ratelimited("Cannot write a new PSI section in a misaligned buffer\n"); in vidtv_psi_ts_psi_write_into()
184 nbytes += vidtv_memset(args->dest_buf, in vidtv_psi_ts_psi_write_into()
185 args->dest_offset + nbytes, in vidtv_psi_ts_psi_write_into()
186 args->dest_buf_sz, in vidtv_psi_ts_psi_write_into()
188 TS_PACKET_LEN - nbytes_past_boundary); in vidtv_psi_ts_psi_write_into()
192 nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN; in vidtv_psi_ts_psi_write_into()
197 ts_header.continuity_counter = *args->continuity_counter; in vidtv_psi_ts_psi_write_into()
199 nbytes += vidtv_memcpy(args->dest_buf, in vidtv_psi_ts_psi_write_into()
200 args->dest_offset + nbytes, in vidtv_psi_ts_psi_write_into()
201 args->dest_buf_sz, in vidtv_psi_ts_psi_write_into()
208 vidtv_ts_inc_cc(args->continuity_counter); in vidtv_psi_ts_psi_write_into()
212 if (args->new_psi_section) in vidtv_psi_ts_psi_write_into()
213 nbytes += vidtv_memset(args->dest_buf, in vidtv_psi_ts_psi_write_into()
214 args->dest_offset + nbytes, in vidtv_psi_ts_psi_write_into()
215 args->dest_buf_sz, in vidtv_psi_ts_psi_write_into()
220 nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN; in vidtv_psi_ts_psi_write_into()
221 payload_write_len = min(TS_PACKET_LEN - nbytes_past_boundary, remaining_len); in vidtv_psi_ts_psi_write_into()
223 nbytes += vidtv_memcpy(args->dest_buf, in vidtv_psi_ts_psi_write_into()
224 args->dest_offset + nbytes, in vidtv_psi_ts_psi_write_into()
225 args->dest_buf_sz, in vidtv_psi_ts_psi_write_into()
226 args->from + payload_offset, in vidtv_psi_ts_psi_write_into()
230 remaining_len -= payload_write_len; in vidtv_psi_ts_psi_write_into()
238 nbytes_past_boundary = (args->dest_offset + nbytes) % TS_PACKET_LEN; in vidtv_psi_ts_psi_write_into()
240 if (args->is_crc) in vidtv_psi_ts_psi_write_into()
241 nbytes += vidtv_memset(args->dest_buf, in vidtv_psi_ts_psi_write_into()
242 args->dest_offset + nbytes, in vidtv_psi_ts_psi_write_into()
243 args->dest_buf_sz, in vidtv_psi_ts_psi_write_into()
245 TS_PACKET_LEN - nbytes_past_boundary); in vidtv_psi_ts_psi_write_into()
253 .dest_buf = args->dest_buf, in table_section_crc32_write_into()
254 .from = &args->crc, in table_section_crc32_write_into()
256 .dest_offset = args->dest_offset, in table_section_crc32_write_into()
257 .pid = args->pid, in table_section_crc32_write_into()
259 .continuity_counter = args->continuity_counter, in table_section_crc32_write_into()
261 .dest_buf_sz = args->dest_buf_sz, in table_section_crc32_write_into()
272 while (head->next) in vidtv_psi_desc_chain()
273 head = head->next; in vidtv_psi_desc_chain()
275 head->next = desc; in vidtv_psi_desc_chain()
292 desc->type = SERVICE_DESCRIPTOR; in vidtv_psi_service_desc_init()
294 desc->length = sizeof_field(struct vidtv_psi_desc_service, service_type) in vidtv_psi_service_desc_init()
300 desc->service_type = service_type; in vidtv_psi_service_desc_init()
302 desc->service_name_len = service_name_len; in vidtv_psi_service_desc_init()
305 desc->service_name = kstrdup(service_name, GFP_KERNEL); in vidtv_psi_service_desc_init()
306 if (!desc->service_name) in vidtv_psi_service_desc_init()
310 desc->provider_name_len = provider_name_len; in vidtv_psi_service_desc_init()
313 desc->provider_name = kstrdup(provider_name, GFP_KERNEL); in vidtv_psi_service_desc_init()
314 if (!desc->provider_name) in vidtv_psi_service_desc_init()
323 kfree(desc->service_name); in vidtv_psi_service_desc_init()
341 desc->type = REGISTRATION_DESCRIPTOR; in vidtv_psi_registration_desc_init()
343 desc->length = sizeof_field(struct vidtv_psi_desc_registration, format_id) in vidtv_psi_registration_desc_init()
346 desc->format_id = format_id; in vidtv_psi_registration_desc_init()
349 memcpy(desc->additional_identification_info, in vidtv_psi_registration_desc_init()
367 desc->type = NETWORK_NAME_DESCRIPTOR; in vidtv_psi_network_name_desc_init()
369 desc->length = network_name_len; in vidtv_psi_network_name_desc_init()
372 desc->network_name = kstrdup(network_name, GFP_KERNEL); in vidtv_psi_network_name_desc_init()
373 if (!desc->network_name) { in vidtv_psi_network_name_desc_init()
397 desc->type = SERVICE_LIST_DESCRIPTOR; in vidtv_psi_service_list_desc_init()
404 head_e = head_e->next; in vidtv_psi_service_list_desc_init()
411 curr_e->service_id = entry->service_id; in vidtv_psi_service_list_desc_init()
412 curr_e->service_type = entry->service_type; in vidtv_psi_service_list_desc_init()
414 length += sizeof(struct vidtv_psi_desc_service_list_entry) - in vidtv_psi_service_list_desc_init()
420 prev_e->next = curr_e; in vidtv_psi_service_list_desc_init()
423 entry = entry->next; in vidtv_psi_service_list_desc_init()
426 desc->length = length; in vidtv_psi_service_list_desc_init()
427 desc->service_list = head_e; in vidtv_psi_service_list_desc_init()
448 desc->type = SHORT_EVENT_DESCRIPTOR; in vidtv_psi_short_event_desc_init()
450 desc->length = ISO_LANGUAGE_CODE_LEN + in vidtv_psi_short_event_desc_init()
456 desc->event_name_len = event_name_len; in vidtv_psi_short_event_desc_init()
457 desc->text_len = text_len; in vidtv_psi_short_event_desc_init()
462 desc->iso_language_code = kstrdup(iso_language_code, GFP_KERNEL); in vidtv_psi_short_event_desc_init()
463 if (!desc->iso_language_code) in vidtv_psi_short_event_desc_init()
467 desc->event_name = kstrdup(event_name, GFP_KERNEL); in vidtv_psi_short_event_desc_init()
468 if (!desc->event_name) in vidtv_psi_short_event_desc_init()
473 desc->text = kstrdup(text, GFP_KERNEL); in vidtv_psi_short_event_desc_init()
474 if (!desc->text) in vidtv_psi_short_event_desc_init()
483 kfree(desc->event_name); in vidtv_psi_short_event_desc_init()
485 kfree(desc->iso_language_code); in vidtv_psi_short_event_desc_init()
502 switch (desc->type) { in vidtv_psi_desc_clone()
507 service->service_type, in vidtv_psi_desc_clone()
508 service->service_name, in vidtv_psi_desc_clone()
509 service->provider_name); in vidtv_psi_desc_clone()
516 desc_network_name->network_name); in vidtv_psi_desc_clone()
523 desc_service_list->service_list); in vidtv_psi_desc_clone()
530 desc_short_event->iso_language_code, in vidtv_psi_desc_clone()
531 desc_short_event->event_name, in vidtv_psi_desc_clone()
532 desc_short_event->text); in vidtv_psi_desc_clone()
537 curr = kmemdup(desc, sizeof(*desc) + desc->length, GFP_KERNEL); in vidtv_psi_desc_clone()
545 curr->next = NULL; in vidtv_psi_desc_clone()
549 prev->next = curr; in vidtv_psi_desc_clone()
552 desc = desc->next; in vidtv_psi_desc_clone()
567 curr = curr->next; in vidtv_psi_desc_destroy()
569 switch (tmp->type) { in vidtv_psi_desc_destroy()
571 kfree(((struct vidtv_psi_desc_service *)tmp)->provider_name); in vidtv_psi_desc_destroy()
572 kfree(((struct vidtv_psi_desc_service *)tmp)->service_name); in vidtv_psi_desc_destroy()
580 kfree(((struct vidtv_psi_desc_network_name *)tmp)->network_name); in vidtv_psi_desc_destroy()
584 sl_entry = ((struct vidtv_psi_desc_service_list *)tmp)->service_list; in vidtv_psi_desc_destroy()
587 sl_entry = sl_entry->next; in vidtv_psi_desc_destroy()
593 kfree(((struct vidtv_psi_desc_short_event *)tmp)->iso_language_code); in vidtv_psi_desc_destroy()
594 kfree(((struct vidtv_psi_desc_short_event *)tmp)->event_name); in vidtv_psi_desc_destroy()
595 kfree(((struct vidtv_psi_desc_short_event *)tmp)->text); in vidtv_psi_desc_destroy()
600 tmp->type); in vidtv_psi_desc_destroy()
619 length += desc->length; /* from 'length' field until the end of the descriptor */ in vidtv_psi_desc_comp_loop_len()
620 desc = desc->next; in vidtv_psi_desc_comp_loop_len()
645 if (vidtv_psi_get_sec_len(&pmt->header) > MAX_SECTION_LEN) in vidtv_pmt_desc_assign()
648 vidtv_psi_update_version_num(&pmt->header); in vidtv_pmt_desc_assign()
658 if (vidtv_psi_get_sec_len(&sdt->header) > MAX_SECTION_LEN) in vidtv_sdt_desc_assign()
661 vidtv_psi_update_version_num(&sdt->header); in vidtv_sdt_desc_assign()
667 .dest_buf = args->dest_buf, in vidtv_psi_desc_write_into()
668 .from = &args->desc->type, in vidtv_psi_desc_write_into()
669 .pid = args->pid, in vidtv_psi_desc_write_into()
671 .continuity_counter = args->continuity_counter, in vidtv_psi_desc_write_into()
673 .dest_buf_sz = args->dest_buf_sz, in vidtv_psi_desc_write_into()
674 .crc = args->crc, in vidtv_psi_desc_write_into()
681 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
685 switch (args->desc->type) { in vidtv_psi_desc_write_into()
687 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
690 psi_args.from = &((struct vidtv_psi_desc_service *)args->desc)->service_type; in vidtv_psi_desc_write_into()
694 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
695 psi_args.len = ((struct vidtv_psi_desc_service *)args->desc)->provider_name_len; in vidtv_psi_desc_write_into()
696 psi_args.from = ((struct vidtv_psi_desc_service *)args->desc)->provider_name; in vidtv_psi_desc_write_into()
700 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
702 psi_args.from = &((struct vidtv_psi_desc_service *)args->desc)->service_name_len; in vidtv_psi_desc_write_into()
706 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
707 psi_args.len = ((struct vidtv_psi_desc_service *)args->desc)->service_name_len; in vidtv_psi_desc_write_into()
708 psi_args.from = ((struct vidtv_psi_desc_service *)args->desc)->service_name; in vidtv_psi_desc_write_into()
714 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
715 psi_args.len = args->desc->length; in vidtv_psi_desc_write_into()
716 psi_args.from = ((struct vidtv_psi_desc_network_name *)args->desc)->network_name; in vidtv_psi_desc_write_into()
722 serv_list_entry = ((struct vidtv_psi_desc_service_list *)args->desc)->service_list; in vidtv_psi_desc_write_into()
724 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
725 psi_args.len = sizeof(struct vidtv_psi_desc_service_list_entry) - in vidtv_psi_desc_write_into()
731 serv_list_entry = serv_list_entry->next; in vidtv_psi_desc_write_into()
736 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
739 args->desc)->iso_language_code; in vidtv_psi_desc_write_into()
743 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
746 args->desc)->event_name_len; in vidtv_psi_desc_write_into()
750 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
751 psi_args.len = ((struct vidtv_psi_desc_short_event *)args->desc)->event_name_len; in vidtv_psi_desc_write_into()
752 psi_args.from = ((struct vidtv_psi_desc_short_event *)args->desc)->event_name; in vidtv_psi_desc_write_into()
756 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
758 psi_args.from = &((struct vidtv_psi_desc_short_event *)args->desc)->text_len; in vidtv_psi_desc_write_into()
762 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
763 psi_args.len = ((struct vidtv_psi_desc_short_event *)args->desc)->text_len; in vidtv_psi_desc_write_into()
764 psi_args.from = ((struct vidtv_psi_desc_short_event *)args->desc)->text; in vidtv_psi_desc_write_into()
772 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
773 psi_args.len = args->desc->length; in vidtv_psi_desc_write_into()
774 psi_args.from = &args->desc->data; in vidtv_psi_desc_write_into()
787 .dest_buf = args->dest_buf, in vidtv_psi_table_header_write_into()
788 .from = args->h, in vidtv_psi_table_header_write_into()
790 .dest_offset = args->dest_offset, in vidtv_psi_table_header_write_into()
791 .pid = args->pid, in vidtv_psi_table_header_write_into()
793 .continuity_counter = args->continuity_counter, in vidtv_psi_table_header_write_into()
795 .dest_buf_sz = args->dest_buf_sz, in vidtv_psi_table_header_write_into()
796 .crc = args->crc, in vidtv_psi_table_header_write_into()
808 /* see ISO/IEC 13818-1 : 2000 p.43 */ in vidtv_psi_pat_table_update_sec_len()
814 for (i = 0; i < pat->num_pat; ++i) in vidtv_psi_pat_table_update_sec_len()
815 length += sizeof(struct vidtv_psi_table_pat_program) - in vidtv_psi_pat_table_update_sec_len()
820 vidtv_psi_set_sec_len(&pat->header, length); in vidtv_psi_pat_table_update_sec_len()
825 struct vidtv_psi_table_pmt_stream *s = pmt->stream; in vidtv_psi_pmt_table_update_sec_len()
829 /* see ISO/IEC 13818-1 : 2000 p.46 */ in vidtv_psi_pmt_table_update_sec_len()
834 desc_loop_len = vidtv_psi_desc_comp_loop_len(pmt->descriptor); in vidtv_psi_pmt_table_update_sec_len()
835 vidtv_psi_set_desc_loop_len(&pmt->bitfield2, desc_loop_len, 10); in vidtv_psi_pmt_table_update_sec_len()
841 length += sizeof(struct vidtv_psi_table_pmt_stream) - in vidtv_psi_pmt_table_update_sec_len()
842 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_pmt_table_update_sec_len()
845 desc_loop_len = vidtv_psi_desc_comp_loop_len(s->descriptor); in vidtv_psi_pmt_table_update_sec_len()
846 vidtv_psi_set_desc_loop_len(&s->bitfield2, desc_loop_len, 10); in vidtv_psi_pmt_table_update_sec_len()
850 s = s->next; in vidtv_psi_pmt_table_update_sec_len()
855 vidtv_psi_set_sec_len(&pmt->header, length); in vidtv_psi_pmt_table_update_sec_len()
860 struct vidtv_psi_table_sdt_service *s = sdt->service; in vidtv_psi_sdt_table_update_sec_len()
874 length += sizeof(struct vidtv_psi_table_sdt_service) - in vidtv_psi_sdt_table_update_sec_len()
875 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_sdt_table_update_sec_len()
878 desc_loop_len = vidtv_psi_desc_comp_loop_len(s->descriptor); in vidtv_psi_sdt_table_update_sec_len()
879 vidtv_psi_set_desc_loop_len(&s->bitfield, desc_loop_len, 12); in vidtv_psi_sdt_table_update_sec_len()
883 s = s->next; in vidtv_psi_sdt_table_update_sec_len()
887 vidtv_psi_set_sec_len(&sdt->header, length); in vidtv_psi_sdt_table_update_sec_len()
902 program->service_id = cpu_to_be16(service_id); in vidtv_psi_pat_program_init()
905 program->bitfield = cpu_to_be16((RESERVED << 13) | program_map_pid); in vidtv_psi_pat_program_init()
906 program->next = NULL; in vidtv_psi_pat_program_init()
909 while (head->next) in vidtv_psi_pat_program_init()
910 head = head->next; in vidtv_psi_pat_program_init()
912 head->next = program; in vidtv_psi_pat_program_init()
926 curr = curr->next; in vidtv_psi_pat_program_destroy()
943 if (p == pat->program) in vidtv_psi_pat_program_assign()
948 program = program->next; in vidtv_psi_pat_program_assign()
951 pat->num_pat = program_count; in vidtv_psi_pat_program_assign()
952 pat->program = p; in vidtv_psi_pat_program_assign()
958 } while (vidtv_psi_get_sec_len(&pat->header) > MAX_SECTION_LEN); in vidtv_psi_pat_program_assign()
960 vidtv_psi_update_version_num(&pat->header); in vidtv_psi_pat_program_assign()
974 pat->header.table_id = 0x0; in vidtv_psi_pat_table_init()
976 pat->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ZERO << 14) | (ONES << 12)); in vidtv_psi_pat_table_init()
977 pat->header.id = cpu_to_be16(transport_stream_id); in vidtv_psi_pat_table_init()
978 pat->header.current_next = 0x1; in vidtv_psi_pat_table_init()
980 pat->header.version = 0x1f; in vidtv_psi_pat_table_init()
982 pat->header.one2 = 0x03; in vidtv_psi_pat_table_init()
983 pat->header.section_id = 0x0; in vidtv_psi_pat_table_init()
984 pat->header.last_section = 0x0; in vidtv_psi_pat_table_init()
993 struct vidtv_psi_table_pat_program *p = args->pat->program; in vidtv_psi_pat_write_into()
995 .dest_buf = args->buf, in vidtv_psi_pat_write_into()
996 .dest_offset = args->offset, in vidtv_psi_pat_write_into()
998 .h = &args->pat->header, in vidtv_psi_pat_write_into()
999 .continuity_counter = args->continuity_counter, in vidtv_psi_pat_write_into()
1000 .dest_buf_sz = args->buf_sz, in vidtv_psi_pat_write_into()
1003 .dest_buf = args->buf, in vidtv_psi_pat_write_into()
1006 .continuity_counter = args->continuity_counter, in vidtv_psi_pat_write_into()
1008 .dest_buf_sz = args->buf_sz, in vidtv_psi_pat_write_into()
1011 .dest_buf = args->buf, in vidtv_psi_pat_write_into()
1013 .dest_buf_sz = args->buf_sz, in vidtv_psi_pat_write_into()
1018 vidtv_psi_pat_table_update_sec_len(args->pat); in vidtv_psi_pat_write_into()
1032 psi_args.len = sizeof(*p) - in vidtv_psi_pat_write_into()
1034 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_pat_write_into()
1035 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_pat_write_into()
1039 p = p->next; in vidtv_psi_pat_write_into()
1042 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_pat_write_into()
1043 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_pat_write_into()
1055 vidtv_psi_pat_program_destroy(p->program); in vidtv_psi_pat_table_destroy()
1074 stream->type = stream_type; in vidtv_psi_pmt_stream_init()
1076 stream->bitfield = cpu_to_be16((RESERVED1 << 13) | es_pid); in vidtv_psi_pmt_stream_init()
1078 desc_loop_len = vidtv_psi_desc_comp_loop_len(stream->descriptor); in vidtv_psi_pmt_stream_init()
1080 stream->bitfield2 = cpu_to_be16((RESERVED2 << 12) | in vidtv_psi_pmt_stream_init()
1083 stream->next = NULL; in vidtv_psi_pmt_stream_init()
1086 while (head->next) in vidtv_psi_pmt_stream_init()
1087 head = head->next; in vidtv_psi_pmt_stream_init()
1089 head->next = stream; in vidtv_psi_pmt_stream_init()
1102 curr_stream = curr_stream->next; in vidtv_psi_pmt_stream_destroy()
1103 vidtv_psi_desc_destroy(tmp_stream->descriptor); in vidtv_psi_pmt_stream_destroy()
1113 if (s == pmt->stream) in vidtv_psi_pmt_stream_assign()
1116 pmt->stream = s; in vidtv_psi_pmt_stream_assign()
1120 } while (vidtv_psi_get_sec_len(&pmt->header) > MAX_SECTION_LEN); in vidtv_psi_pmt_stream_assign()
1122 vidtv_psi_update_version_num(&pmt->header); in vidtv_psi_pmt_stream_assign()
1128 struct vidtv_psi_table_pat_program *program = pat->program; in vidtv_psi_pmt_get_pid()
1136 if (program->service_id == section->header.id) in vidtv_psi_pmt_get_pid()
1139 program = program->next; in vidtv_psi_pmt_get_pid()
1163 pmt->header.table_id = 0x2; in vidtv_psi_pmt_table_init()
1165 pmt->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ZERO << 14) | (ONES << 12)); in vidtv_psi_pmt_table_init()
1167 pmt->header.id = cpu_to_be16(program_number); in vidtv_psi_pmt_table_init()
1168 pmt->header.current_next = 0x1; in vidtv_psi_pmt_table_init()
1170 pmt->header.version = 0x1f; in vidtv_psi_pmt_table_init()
1172 pmt->header.one2 = ONES; in vidtv_psi_pmt_table_init()
1173 pmt->header.section_id = 0; in vidtv_psi_pmt_table_init()
1174 pmt->header.last_section = 0; in vidtv_psi_pmt_table_init()
1176 pmt->bitfield = cpu_to_be16((RESERVED1 << 13) | pcr_pid); in vidtv_psi_pmt_table_init()
1178 desc_loop_len = vidtv_psi_desc_comp_loop_len(pmt->descriptor); in vidtv_psi_pmt_table_init()
1180 pmt->bitfield2 = cpu_to_be16((RESERVED2 << 12) | in vidtv_psi_pmt_table_init()
1191 struct vidtv_psi_desc *table_descriptor = args->pmt->descriptor; in vidtv_psi_pmt_write_into()
1192 struct vidtv_psi_table_pmt_stream *stream = args->pmt->stream; in vidtv_psi_pmt_write_into()
1197 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1198 .dest_offset = args->offset, in vidtv_psi_pmt_write_into()
1199 .h = &args->pmt->header, in vidtv_psi_pmt_write_into()
1200 .pid = args->pid, in vidtv_psi_pmt_write_into()
1201 .continuity_counter = args->continuity_counter, in vidtv_psi_pmt_write_into()
1202 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1205 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1206 .from = &args->pmt->bitfield, in vidtv_psi_pmt_write_into()
1209 .pid = args->pid, in vidtv_psi_pmt_write_into()
1212 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1216 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1218 .pid = args->pid, in vidtv_psi_pmt_write_into()
1219 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1222 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1223 .pid = args->pid, in vidtv_psi_pmt_write_into()
1224 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1227 vidtv_psi_pmt_table_update_sec_len(args->pmt); in vidtv_psi_pmt_write_into()
1234 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1235 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1240 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1241 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1246 table_descriptor = table_descriptor->next; in vidtv_psi_pmt_write_into()
1253 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1254 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1258 stream_descriptor = stream->descriptor; in vidtv_psi_pmt_write_into()
1262 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1264 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1269 stream_descriptor = stream_descriptor->next; in vidtv_psi_pmt_write_into()
1272 stream = stream->next; in vidtv_psi_pmt_write_into()
1275 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1277 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1287 vidtv_psi_desc_destroy(pmt->descriptor); in vidtv_psi_pmt_table_destroy()
1288 vidtv_psi_pmt_stream_destroy(pmt->stream); in vidtv_psi_pmt_table_destroy()
1305 sdt->header.table_id = 0x42; in vidtv_psi_sdt_table_init()
1306 sdt->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12)); in vidtv_psi_sdt_table_init()
1309 * This is a 16-bit field which serves as a label for identification in vidtv_psi_sdt_table_init()
1313 sdt->header.id = cpu_to_be16(transport_stream_id); in vidtv_psi_sdt_table_init()
1314 sdt->header.current_next = ONE; in vidtv_psi_sdt_table_init()
1316 sdt->header.version = 0x1f; in vidtv_psi_sdt_table_init()
1318 sdt->header.one2 = ONES; in vidtv_psi_sdt_table_init()
1319 sdt->header.section_id = 0; in vidtv_psi_sdt_table_init()
1320 sdt->header.last_section = 0; in vidtv_psi_sdt_table_init()
1329 sdt->network_id = cpu_to_be16(network_id); in vidtv_psi_sdt_table_init()
1330 sdt->reserved = RESERVED; in vidtv_psi_sdt_table_init()
1340 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1341 .dest_offset = args->offset, in vidtv_psi_sdt_write_into()
1342 .h = &args->sdt->header, in vidtv_psi_sdt_write_into()
1344 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1347 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1353 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1356 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1358 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1361 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1363 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1365 struct vidtv_psi_table_sdt_service *service = args->sdt->service; in vidtv_psi_sdt_write_into()
1372 vidtv_psi_sdt_table_update_sec_len(args->sdt); in vidtv_psi_sdt_write_into()
1374 h_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1379 psi_args.from = &args->sdt->network_id; in vidtv_psi_sdt_write_into()
1380 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1381 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1388 psi_args.len = sizeof(struct vidtv_psi_table_sdt_service) - in vidtv_psi_sdt_write_into()
1389 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_sdt_write_into()
1395 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1396 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1400 service_desc = service->descriptor; in vidtv_psi_sdt_write_into()
1404 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1406 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1411 service_desc = service_desc->next; in vidtv_psi_sdt_write_into()
1414 service = service->next; in vidtv_psi_sdt_write_into()
1417 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1419 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1429 vidtv_psi_sdt_service_destroy(sdt->service); in vidtv_psi_sdt_table_destroy()
1451 service->service_id = cpu_to_be16(service_id); in vidtv_psi_sdt_service_init()
1452 service->EIT_schedule = eit_schedule; in vidtv_psi_sdt_service_init()
1453 service->EIT_present_following = eit_present_following; in vidtv_psi_sdt_service_init()
1454 service->reserved = 0x3f; in vidtv_psi_sdt_service_init()
1456 service->bitfield = cpu_to_be16(RUNNING << 13); in vidtv_psi_sdt_service_init()
1459 while (head->next) in vidtv_psi_sdt_service_init()
1460 head = head->next; in vidtv_psi_sdt_service_init()
1462 head->next = service; in vidtv_psi_sdt_service_init()
1476 curr = curr->next; in vidtv_psi_sdt_service_destroy()
1477 vidtv_psi_desc_destroy(tmp->descriptor); in vidtv_psi_sdt_service_destroy()
1487 if (service == sdt->service) in vidtv_psi_sdt_service_assign()
1490 sdt->service = service; in vidtv_psi_sdt_service_assign()
1496 } while (vidtv_psi_get_sec_len(&sdt->header) > MAX_SECTION_LEN); in vidtv_psi_sdt_service_assign()
1498 vidtv_psi_update_version_num(&sdt->header); in vidtv_psi_sdt_service_assign()
1519 program = pat->program; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1521 if (program->service_id) in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1523 program = program->next; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1532 for (program = pat->program; program; program = program->next) { in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1533 if (!program->service_id) in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1535 pmt_secs[i] = vidtv_psi_pmt_table_init(be16_to_cpu(program->service_id), in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1540 i--; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1547 pat->num_pmt = num_pmt; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1563 if (be16_to_cpu(sec->header.id) == program_num) in vidtv_psi_find_pmt_sec()
1573 struct vidtv_psi_table_transport *t = nit->transport; in vidtv_psi_nit_table_update_sec_len()
1583 desc_loop_len = vidtv_psi_desc_comp_loop_len(nit->descriptor); in vidtv_psi_nit_table_update_sec_len()
1584 vidtv_psi_set_desc_loop_len(&nit->bitfield, desc_loop_len, 12); in vidtv_psi_nit_table_update_sec_len()
1592 transport_loop_len += sizeof(struct vidtv_psi_table_transport) - in vidtv_psi_nit_table_update_sec_len()
1593 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_nit_table_update_sec_len()
1598 desc_loop_len = vidtv_psi_desc_comp_loop_len(t->descriptor); in vidtv_psi_nit_table_update_sec_len()
1599 vidtv_psi_set_desc_loop_len(&t->bitfield, desc_loop_len, 12); in vidtv_psi_nit_table_update_sec_len()
1603 t = t->next; in vidtv_psi_nit_table_update_sec_len()
1607 vidtv_psi_set_desc_loop_len(&nit->bitfield2, transport_loop_len, 12); in vidtv_psi_nit_table_update_sec_len()
1610 vidtv_psi_set_sec_len(&nit->header, length); in vidtv_psi_nit_table_update_sec_len()
1633 nit->header.table_id = 0x40; // ACTUAL_NETWORK in vidtv_psi_nit_table_init()
1635 nit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12)); in vidtv_psi_nit_table_init()
1637 nit->header.id = cpu_to_be16(network_id); in vidtv_psi_nit_table_init()
1638 nit->header.current_next = ONE; in vidtv_psi_nit_table_init()
1640 nit->header.version = 0x1f; in vidtv_psi_nit_table_init()
1642 nit->header.one2 = ONES; in vidtv_psi_nit_table_init()
1643 nit->header.section_id = 0; in vidtv_psi_nit_table_init()
1644 nit->header.last_section = 0; in vidtv_psi_nit_table_init()
1646 nit->bitfield = cpu_to_be16(0xf); in vidtv_psi_nit_table_init()
1647 nit->bitfield2 = cpu_to_be16(0xf); in vidtv_psi_nit_table_init()
1649 nit->descriptor = (struct vidtv_psi_desc *) in vidtv_psi_nit_table_init()
1651 if (!nit->descriptor) in vidtv_psi_nit_table_init()
1654 transport->transport_id = cpu_to_be16(transport_stream_id); in vidtv_psi_nit_table_init()
1655 transport->network_id = cpu_to_be16(network_id); in vidtv_psi_nit_table_init()
1656 transport->bitfield = cpu_to_be16(0xf); in vidtv_psi_nit_table_init()
1657 transport->descriptor = (struct vidtv_psi_desc *) in vidtv_psi_nit_table_init()
1659 if (!transport->descriptor) in vidtv_psi_nit_table_init()
1662 nit->transport = transport; in vidtv_psi_nit_table_init()
1669 vidtv_psi_desc_destroy((struct vidtv_psi_desc *)nit->descriptor); in vidtv_psi_nit_table_init()
1681 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1682 .dest_offset = args->offset, in vidtv_psi_nit_write_into()
1683 .h = &args->nit->header, in vidtv_psi_nit_write_into()
1685 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1688 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1689 .from = &args->nit->bitfield, in vidtv_psi_nit_write_into()
1694 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1697 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1699 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1702 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1704 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1706 struct vidtv_psi_desc *table_descriptor = args->nit->descriptor; in vidtv_psi_nit_write_into()
1707 struct vidtv_psi_table_transport *transport = args->nit->transport; in vidtv_psi_nit_write_into()
1712 vidtv_psi_nit_table_update_sec_len(args->nit); in vidtv_psi_nit_write_into()
1714 h_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1721 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1722 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1729 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1731 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1736 table_descriptor = table_descriptor->next; in vidtv_psi_nit_write_into()
1740 psi_args.from = &args->nit->bitfield2; in vidtv_psi_nit_write_into()
1742 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1752 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1756 transport_descriptor = transport->descriptor; in vidtv_psi_nit_write_into()
1760 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1762 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1767 transport_descriptor = transport_descriptor->next; in vidtv_psi_nit_write_into()
1770 transport = transport->next; in vidtv_psi_nit_write_into()
1773 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1775 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1790 curr_t = curr_t->next; in vidtv_psi_transport_destroy()
1791 vidtv_psi_desc_destroy(tmp_t->descriptor); in vidtv_psi_transport_destroy()
1798 vidtv_psi_desc_destroy(nit->descriptor); in vidtv_psi_nit_table_destroy()
1799 vidtv_psi_transport_destroy(nit->transport); in vidtv_psi_nit_table_destroy()
1805 struct vidtv_psi_table_eit_event *e = eit->event; in vidtv_psi_eit_table_update_sec_len()
1817 length += sizeof(struct vidtv_psi_table_eit_event) - in vidtv_psi_eit_table_update_sec_len()
1818 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_eit_table_update_sec_len()
1821 desc_loop_len = vidtv_psi_desc_comp_loop_len(e->descriptor); in vidtv_psi_eit_table_update_sec_len()
1822 vidtv_psi_set_desc_loop_len(&e->bitfield, desc_loop_len, 12); in vidtv_psi_eit_table_update_sec_len()
1826 e = e->next; in vidtv_psi_eit_table_update_sec_len()
1831 vidtv_psi_set_sec_len(&eit->header, length); in vidtv_psi_eit_table_update_sec_len()
1838 if (e == eit->event) in vidtv_psi_eit_event_assign()
1841 eit->event = e; in vidtv_psi_eit_event_assign()
1845 } while (vidtv_psi_get_sec_len(&eit->header) > EIT_MAX_SECTION_LEN); in vidtv_psi_eit_event_assign()
1847 vidtv_psi_update_version_num(&eit->header); in vidtv_psi_eit_event_assign()
1864 eit->header.table_id = 0x4e; //actual_transport_stream: present/following in vidtv_psi_eit_table_init()
1866 eit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12)); in vidtv_psi_eit_table_init()
1868 eit->header.id = service_id; in vidtv_psi_eit_table_init()
1869 eit->header.current_next = ONE; in vidtv_psi_eit_table_init()
1871 eit->header.version = 0x1f; in vidtv_psi_eit_table_init()
1873 eit->header.one2 = ONES; in vidtv_psi_eit_table_init()
1874 eit->header.section_id = 0; in vidtv_psi_eit_table_init()
1875 eit->header.last_section = 0; in vidtv_psi_eit_table_init()
1877 eit->transport_id = cpu_to_be16(transport_stream_id); in vidtv_psi_eit_table_init()
1878 eit->network_id = cpu_to_be16(network_id); in vidtv_psi_eit_table_init()
1880 eit->last_segment = eit->header.last_section; /* not implemented */ in vidtv_psi_eit_table_init()
1881 eit->last_table_id = eit->header.table_id; /* not implemented */ in vidtv_psi_eit_table_init()
1891 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1892 .dest_offset = args->offset, in vidtv_psi_eit_write_into()
1893 .h = &args->eit->header, in vidtv_psi_eit_write_into()
1895 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1898 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1906 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1909 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1911 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1914 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1916 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1918 struct vidtv_psi_table_eit_event *event = args->eit->event; in vidtv_psi_eit_write_into()
1923 vidtv_psi_eit_table_update_sec_len(args->eit); in vidtv_psi_eit_write_into()
1925 h_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1930 psi_args.from = &args->eit->transport_id; in vidtv_psi_eit_write_into()
1931 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1932 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1938 psi_args.len = sizeof(struct vidtv_psi_table_eit_event) - in vidtv_psi_eit_write_into()
1939 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_eit_write_into()
1944 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1948 event_descriptor = event->descriptor; in vidtv_psi_eit_write_into()
1952 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1954 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1959 event_descriptor = event_descriptor->next; in vidtv_psi_eit_write_into()
1962 event = event->next; in vidtv_psi_eit_write_into()
1965 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1967 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1982 int mjd, l; in vidtv_psi_eit_event_init() local
1989 e->event_id = cpu_to_be16(event_id); in vidtv_psi_eit_event_init()
1994 /* Convert date to Modified Julian Date - per EN 300 468 Annex C */ in vidtv_psi_eit_event_init()
1996 l = 1; in vidtv_psi_eit_event_init()
1998 l = 0; in vidtv_psi_eit_event_init()
2001 mjd += (time.tm_year - l) * 36525 / 100; in vidtv_psi_eit_event_init()
2002 mjd += (time.tm_mon + 2 + l * 12) * 306001 / 10000; in vidtv_psi_eit_event_init()
2010 memcpy(e->start_time, &mjd_be, sizeof(mjd_be)); in vidtv_psi_eit_event_init()
2011 e->start_time[2] = bin2bcd(time.tm_hour); in vidtv_psi_eit_event_init()
2012 e->start_time[3] = 0; in vidtv_psi_eit_event_init()
2013 e->start_time[4] = 0; in vidtv_psi_eit_event_init()
2022 memcpy(e->duration, DURATION, sizeof(e->duration)); in vidtv_psi_eit_event_init()
2024 e->bitfield = cpu_to_be16(RUNNING << 13); in vidtv_psi_eit_event_init()
2027 while (head->next) in vidtv_psi_eit_event_init()
2028 head = head->next; in vidtv_psi_eit_event_init()
2030 head->next = e; in vidtv_psi_eit_event_init()
2043 curr_e = curr_e->next; in vidtv_psi_eit_event_destroy()
2044 vidtv_psi_desc_destroy(tmp_e->descriptor); in vidtv_psi_eit_event_destroy()
2051 vidtv_psi_eit_event_destroy(eit->event); in vidtv_psi_eit_table_destroy()