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()
307 desc->provider_name_len = provider_name_len; in vidtv_psi_service_desc_init()
310 desc->provider_name = kstrdup(provider_name, GFP_KERNEL); in vidtv_psi_service_desc_init()
328 desc->type = REGISTRATION_DESCRIPTOR; in vidtv_psi_registration_desc_init()
330 desc->length = sizeof_field(struct vidtv_psi_desc_registration, format_id) in vidtv_psi_registration_desc_init()
333 desc->format_id = format_id; in vidtv_psi_registration_desc_init()
336 memcpy(desc->additional_identification_info, in vidtv_psi_registration_desc_init()
354 desc->type = NETWORK_NAME_DESCRIPTOR; in vidtv_psi_network_name_desc_init()
356 desc->length = network_name_len; in vidtv_psi_network_name_desc_init()
359 desc->network_name = kstrdup(network_name, GFP_KERNEL); in vidtv_psi_network_name_desc_init()
379 desc->type = SERVICE_LIST_DESCRIPTOR; in vidtv_psi_service_list_desc_init()
386 head_e = head_e->next; in vidtv_psi_service_list_desc_init()
393 curr_e->service_id = entry->service_id; in vidtv_psi_service_list_desc_init()
394 curr_e->service_type = entry->service_type; in vidtv_psi_service_list_desc_init()
396 length += sizeof(struct vidtv_psi_desc_service_list_entry) - in vidtv_psi_service_list_desc_init()
402 prev_e->next = curr_e; in vidtv_psi_service_list_desc_init()
405 entry = entry->next; in vidtv_psi_service_list_desc_init()
408 desc->length = length; in vidtv_psi_service_list_desc_init()
409 desc->service_list = head_e; in vidtv_psi_service_list_desc_init()
430 desc->type = SHORT_EVENT_DESCRIPTOR; in vidtv_psi_short_event_desc_init()
432 desc->length = ISO_LANGUAGE_CODE_LEN + in vidtv_psi_short_event_desc_init()
438 desc->event_name_len = event_name_len; in vidtv_psi_short_event_desc_init()
439 desc->text_len = text_len; in vidtv_psi_short_event_desc_init()
444 desc->iso_language_code = kstrdup(iso_language_code, GFP_KERNEL); in vidtv_psi_short_event_desc_init()
447 desc->event_name = kstrdup(event_name, GFP_KERNEL); in vidtv_psi_short_event_desc_init()
450 desc->text = kstrdup(text, GFP_KERNEL); in vidtv_psi_short_event_desc_init()
467 switch (desc->type) { in vidtv_psi_desc_clone()
472 service->service_type, in vidtv_psi_desc_clone()
473 service->service_name, in vidtv_psi_desc_clone()
474 service->provider_name); in vidtv_psi_desc_clone()
481 desc_network_name->network_name); in vidtv_psi_desc_clone()
488 desc_service_list->service_list); in vidtv_psi_desc_clone()
495 desc_short_event->iso_language_code, in vidtv_psi_desc_clone()
496 desc_short_event->event_name, in vidtv_psi_desc_clone()
497 desc_short_event->text); in vidtv_psi_desc_clone()
502 curr = kmemdup(desc, sizeof(*desc) + desc->length, GFP_KERNEL); in vidtv_psi_desc_clone()
510 curr->next = NULL; in vidtv_psi_desc_clone()
514 prev->next = curr; in vidtv_psi_desc_clone()
517 desc = desc->next; in vidtv_psi_desc_clone()
532 curr = curr->next; in vidtv_psi_desc_destroy()
534 switch (tmp->type) { in vidtv_psi_desc_destroy()
536 kfree(((struct vidtv_psi_desc_service *)tmp)->provider_name); in vidtv_psi_desc_destroy()
537 kfree(((struct vidtv_psi_desc_service *)tmp)->service_name); in vidtv_psi_desc_destroy()
545 kfree(((struct vidtv_psi_desc_network_name *)tmp)->network_name); in vidtv_psi_desc_destroy()
549 sl_entry = ((struct vidtv_psi_desc_service_list *)tmp)->service_list; in vidtv_psi_desc_destroy()
552 sl_entry = sl_entry->next; in vidtv_psi_desc_destroy()
558 kfree(((struct vidtv_psi_desc_short_event *)tmp)->iso_language_code); in vidtv_psi_desc_destroy()
559 kfree(((struct vidtv_psi_desc_short_event *)tmp)->event_name); in vidtv_psi_desc_destroy()
560 kfree(((struct vidtv_psi_desc_short_event *)tmp)->text); in vidtv_psi_desc_destroy()
565 tmp->type); in vidtv_psi_desc_destroy()
584 length += desc->length; /* from 'length' field until the end of the descriptor */ in vidtv_psi_desc_comp_loop_len()
585 desc = desc->next; in vidtv_psi_desc_comp_loop_len()
610 if (vidtv_psi_get_sec_len(&pmt->header) > MAX_SECTION_LEN) in vidtv_pmt_desc_assign()
613 vidtv_psi_update_version_num(&pmt->header); in vidtv_pmt_desc_assign()
623 if (vidtv_psi_get_sec_len(&sdt->header) > MAX_SECTION_LEN) in vidtv_sdt_desc_assign()
626 vidtv_psi_update_version_num(&sdt->header); in vidtv_sdt_desc_assign()
632 .dest_buf = args->dest_buf, in vidtv_psi_desc_write_into()
633 .from = &args->desc->type, in vidtv_psi_desc_write_into()
634 .pid = args->pid, in vidtv_psi_desc_write_into()
636 .continuity_counter = args->continuity_counter, in vidtv_psi_desc_write_into()
638 .dest_buf_sz = args->dest_buf_sz, in vidtv_psi_desc_write_into()
639 .crc = args->crc, in vidtv_psi_desc_write_into()
646 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
650 switch (args->desc->type) { in vidtv_psi_desc_write_into()
652 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
655 psi_args.from = &((struct vidtv_psi_desc_service *)args->desc)->service_type; in vidtv_psi_desc_write_into()
659 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
660 psi_args.len = ((struct vidtv_psi_desc_service *)args->desc)->provider_name_len; in vidtv_psi_desc_write_into()
661 psi_args.from = ((struct vidtv_psi_desc_service *)args->desc)->provider_name; in vidtv_psi_desc_write_into()
665 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
667 psi_args.from = &((struct vidtv_psi_desc_service *)args->desc)->service_name_len; in vidtv_psi_desc_write_into()
671 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
672 psi_args.len = ((struct vidtv_psi_desc_service *)args->desc)->service_name_len; in vidtv_psi_desc_write_into()
673 psi_args.from = ((struct vidtv_psi_desc_service *)args->desc)->service_name; in vidtv_psi_desc_write_into()
679 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
680 psi_args.len = args->desc->length; in vidtv_psi_desc_write_into()
681 psi_args.from = ((struct vidtv_psi_desc_network_name *)args->desc)->network_name; in vidtv_psi_desc_write_into()
687 serv_list_entry = ((struct vidtv_psi_desc_service_list *)args->desc)->service_list; in vidtv_psi_desc_write_into()
689 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
690 psi_args.len = sizeof(struct vidtv_psi_desc_service_list_entry) - in vidtv_psi_desc_write_into()
696 serv_list_entry = serv_list_entry->next; in vidtv_psi_desc_write_into()
701 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
704 args->desc)->iso_language_code; in vidtv_psi_desc_write_into()
708 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
711 args->desc)->event_name_len; in vidtv_psi_desc_write_into()
715 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
716 psi_args.len = ((struct vidtv_psi_desc_short_event *)args->desc)->event_name_len; in vidtv_psi_desc_write_into()
717 psi_args.from = ((struct vidtv_psi_desc_short_event *)args->desc)->event_name; in vidtv_psi_desc_write_into()
721 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
723 psi_args.from = &((struct vidtv_psi_desc_short_event *)args->desc)->text_len; in vidtv_psi_desc_write_into()
727 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
728 psi_args.len = ((struct vidtv_psi_desc_short_event *)args->desc)->text_len; in vidtv_psi_desc_write_into()
729 psi_args.from = ((struct vidtv_psi_desc_short_event *)args->desc)->text; in vidtv_psi_desc_write_into()
737 psi_args.dest_offset = args->dest_offset + nbytes; in vidtv_psi_desc_write_into()
738 psi_args.len = args->desc->length; in vidtv_psi_desc_write_into()
739 psi_args.from = &args->desc->data; in vidtv_psi_desc_write_into()
752 .dest_buf = args->dest_buf, in vidtv_psi_table_header_write_into()
753 .from = args->h, in vidtv_psi_table_header_write_into()
755 .dest_offset = args->dest_offset, in vidtv_psi_table_header_write_into()
756 .pid = args->pid, in vidtv_psi_table_header_write_into()
758 .continuity_counter = args->continuity_counter, in vidtv_psi_table_header_write_into()
760 .dest_buf_sz = args->dest_buf_sz, in vidtv_psi_table_header_write_into()
761 .crc = args->crc, in vidtv_psi_table_header_write_into()
773 /* see ISO/IEC 13818-1 : 2000 p.43 */ in vidtv_psi_pat_table_update_sec_len()
779 for (i = 0; i < pat->num_pat; ++i) in vidtv_psi_pat_table_update_sec_len()
780 length += sizeof(struct vidtv_psi_table_pat_program) - in vidtv_psi_pat_table_update_sec_len()
785 vidtv_psi_set_sec_len(&pat->header, length); in vidtv_psi_pat_table_update_sec_len()
790 struct vidtv_psi_table_pmt_stream *s = pmt->stream; in vidtv_psi_pmt_table_update_sec_len()
794 /* see ISO/IEC 13818-1 : 2000 p.46 */ in vidtv_psi_pmt_table_update_sec_len()
799 desc_loop_len = vidtv_psi_desc_comp_loop_len(pmt->descriptor); in vidtv_psi_pmt_table_update_sec_len()
800 vidtv_psi_set_desc_loop_len(&pmt->bitfield2, desc_loop_len, 10); in vidtv_psi_pmt_table_update_sec_len()
806 length += sizeof(struct vidtv_psi_table_pmt_stream) - in vidtv_psi_pmt_table_update_sec_len()
807 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_pmt_table_update_sec_len()
810 desc_loop_len = vidtv_psi_desc_comp_loop_len(s->descriptor); in vidtv_psi_pmt_table_update_sec_len()
811 vidtv_psi_set_desc_loop_len(&s->bitfield2, desc_loop_len, 10); in vidtv_psi_pmt_table_update_sec_len()
815 s = s->next; in vidtv_psi_pmt_table_update_sec_len()
820 vidtv_psi_set_sec_len(&pmt->header, length); in vidtv_psi_pmt_table_update_sec_len()
825 struct vidtv_psi_table_sdt_service *s = sdt->service; in vidtv_psi_sdt_table_update_sec_len()
839 length += sizeof(struct vidtv_psi_table_sdt_service) - in vidtv_psi_sdt_table_update_sec_len()
840 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_sdt_table_update_sec_len()
843 desc_loop_len = vidtv_psi_desc_comp_loop_len(s->descriptor); in vidtv_psi_sdt_table_update_sec_len()
844 vidtv_psi_set_desc_loop_len(&s->bitfield, desc_loop_len, 12); in vidtv_psi_sdt_table_update_sec_len()
848 s = s->next; in vidtv_psi_sdt_table_update_sec_len()
852 vidtv_psi_set_sec_len(&sdt->header, length); in vidtv_psi_sdt_table_update_sec_len()
867 program->service_id = cpu_to_be16(service_id); in vidtv_psi_pat_program_init()
870 program->bitfield = cpu_to_be16((RESERVED << 13) | program_map_pid); in vidtv_psi_pat_program_init()
871 program->next = NULL; in vidtv_psi_pat_program_init()
874 while (head->next) in vidtv_psi_pat_program_init()
875 head = head->next; in vidtv_psi_pat_program_init()
877 head->next = program; in vidtv_psi_pat_program_init()
891 curr = curr->next; in vidtv_psi_pat_program_destroy()
908 if (p == pat->program) in vidtv_psi_pat_program_assign()
913 program = program->next; in vidtv_psi_pat_program_assign()
916 pat->num_pat = program_count; in vidtv_psi_pat_program_assign()
917 pat->program = p; in vidtv_psi_pat_program_assign()
923 } while (vidtv_psi_get_sec_len(&pat->header) > MAX_SECTION_LEN); in vidtv_psi_pat_program_assign()
925 vidtv_psi_update_version_num(&pat->header); in vidtv_psi_pat_program_assign()
939 pat->header.table_id = 0x0; in vidtv_psi_pat_table_init()
941 pat->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ZERO << 14) | (ONES << 12)); in vidtv_psi_pat_table_init()
942 pat->header.id = cpu_to_be16(transport_stream_id); in vidtv_psi_pat_table_init()
943 pat->header.current_next = 0x1; in vidtv_psi_pat_table_init()
945 pat->header.version = 0x1f; in vidtv_psi_pat_table_init()
947 pat->header.one2 = 0x03; in vidtv_psi_pat_table_init()
948 pat->header.section_id = 0x0; in vidtv_psi_pat_table_init()
949 pat->header.last_section = 0x0; in vidtv_psi_pat_table_init()
958 struct vidtv_psi_table_pat_program *p = args->pat->program; in vidtv_psi_pat_write_into()
960 .dest_buf = args->buf, in vidtv_psi_pat_write_into()
961 .dest_offset = args->offset, in vidtv_psi_pat_write_into()
963 .h = &args->pat->header, in vidtv_psi_pat_write_into()
964 .continuity_counter = args->continuity_counter, in vidtv_psi_pat_write_into()
965 .dest_buf_sz = args->buf_sz, in vidtv_psi_pat_write_into()
968 .dest_buf = args->buf, in vidtv_psi_pat_write_into()
971 .continuity_counter = args->continuity_counter, in vidtv_psi_pat_write_into()
973 .dest_buf_sz = args->buf_sz, in vidtv_psi_pat_write_into()
976 .dest_buf = args->buf, in vidtv_psi_pat_write_into()
978 .dest_buf_sz = args->buf_sz, in vidtv_psi_pat_write_into()
983 vidtv_psi_pat_table_update_sec_len(args->pat); in vidtv_psi_pat_write_into()
997 psi_args.len = sizeof(*p) - in vidtv_psi_pat_write_into()
999 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_pat_write_into()
1000 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_pat_write_into()
1004 p = p->next; in vidtv_psi_pat_write_into()
1007 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_pat_write_into()
1008 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_pat_write_into()
1020 vidtv_psi_pat_program_destroy(p->program); in vidtv_psi_pat_table_destroy()
1039 stream->type = stream_type; in vidtv_psi_pmt_stream_init()
1041 stream->bitfield = cpu_to_be16((RESERVED1 << 13) | es_pid); in vidtv_psi_pmt_stream_init()
1043 desc_loop_len = vidtv_psi_desc_comp_loop_len(stream->descriptor); in vidtv_psi_pmt_stream_init()
1045 stream->bitfield2 = cpu_to_be16((RESERVED2 << 12) | in vidtv_psi_pmt_stream_init()
1048 stream->next = NULL; in vidtv_psi_pmt_stream_init()
1051 while (head->next) in vidtv_psi_pmt_stream_init()
1052 head = head->next; in vidtv_psi_pmt_stream_init()
1054 head->next = stream; in vidtv_psi_pmt_stream_init()
1067 curr_stream = curr_stream->next; in vidtv_psi_pmt_stream_destroy()
1068 vidtv_psi_desc_destroy(tmp_stream->descriptor); in vidtv_psi_pmt_stream_destroy()
1078 if (s == pmt->stream) in vidtv_psi_pmt_stream_assign()
1081 pmt->stream = s; in vidtv_psi_pmt_stream_assign()
1085 } while (vidtv_psi_get_sec_len(&pmt->header) > MAX_SECTION_LEN); in vidtv_psi_pmt_stream_assign()
1087 vidtv_psi_update_version_num(&pmt->header); in vidtv_psi_pmt_stream_assign()
1093 struct vidtv_psi_table_pat_program *program = pat->program; in vidtv_psi_pmt_get_pid()
1101 if (program->service_id == section->header.id) in vidtv_psi_pmt_get_pid()
1104 program = program->next; in vidtv_psi_pmt_get_pid()
1128 pmt->header.table_id = 0x2; in vidtv_psi_pmt_table_init()
1130 pmt->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ZERO << 14) | (ONES << 12)); in vidtv_psi_pmt_table_init()
1132 pmt->header.id = cpu_to_be16(program_number); in vidtv_psi_pmt_table_init()
1133 pmt->header.current_next = 0x1; in vidtv_psi_pmt_table_init()
1135 pmt->header.version = 0x1f; in vidtv_psi_pmt_table_init()
1137 pmt->header.one2 = ONES; in vidtv_psi_pmt_table_init()
1138 pmt->header.section_id = 0; in vidtv_psi_pmt_table_init()
1139 pmt->header.last_section = 0; in vidtv_psi_pmt_table_init()
1141 pmt->bitfield = cpu_to_be16((RESERVED1 << 13) | pcr_pid); in vidtv_psi_pmt_table_init()
1143 desc_loop_len = vidtv_psi_desc_comp_loop_len(pmt->descriptor); in vidtv_psi_pmt_table_init()
1145 pmt->bitfield2 = cpu_to_be16((RESERVED2 << 12) | in vidtv_psi_pmt_table_init()
1156 struct vidtv_psi_desc *table_descriptor = args->pmt->descriptor; in vidtv_psi_pmt_write_into()
1157 struct vidtv_psi_table_pmt_stream *stream = args->pmt->stream; in vidtv_psi_pmt_write_into()
1162 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1163 .dest_offset = args->offset, in vidtv_psi_pmt_write_into()
1164 .h = &args->pmt->header, in vidtv_psi_pmt_write_into()
1165 .pid = args->pid, in vidtv_psi_pmt_write_into()
1166 .continuity_counter = args->continuity_counter, in vidtv_psi_pmt_write_into()
1167 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1170 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1171 .from = &args->pmt->bitfield, in vidtv_psi_pmt_write_into()
1174 .pid = args->pid, in vidtv_psi_pmt_write_into()
1177 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1181 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1183 .pid = args->pid, in vidtv_psi_pmt_write_into()
1184 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1187 .dest_buf = args->buf, in vidtv_psi_pmt_write_into()
1188 .pid = args->pid, in vidtv_psi_pmt_write_into()
1189 .dest_buf_sz = args->buf_sz, in vidtv_psi_pmt_write_into()
1192 vidtv_psi_pmt_table_update_sec_len(args->pmt); in vidtv_psi_pmt_write_into()
1199 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1200 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1205 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1206 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1211 table_descriptor = table_descriptor->next; in vidtv_psi_pmt_write_into()
1218 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1219 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1223 stream_descriptor = stream->descriptor; in vidtv_psi_pmt_write_into()
1227 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1229 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1234 stream_descriptor = stream_descriptor->next; in vidtv_psi_pmt_write_into()
1237 stream = stream->next; in vidtv_psi_pmt_write_into()
1240 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_pmt_write_into()
1242 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_pmt_write_into()
1252 vidtv_psi_desc_destroy(pmt->descriptor); in vidtv_psi_pmt_table_destroy()
1253 vidtv_psi_pmt_stream_destroy(pmt->stream); in vidtv_psi_pmt_table_destroy()
1270 sdt->header.table_id = 0x42; in vidtv_psi_sdt_table_init()
1271 sdt->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12)); in vidtv_psi_sdt_table_init()
1274 * This is a 16-bit field which serves as a label for identification in vidtv_psi_sdt_table_init()
1278 sdt->header.id = cpu_to_be16(transport_stream_id); in vidtv_psi_sdt_table_init()
1279 sdt->header.current_next = ONE; in vidtv_psi_sdt_table_init()
1281 sdt->header.version = 0x1f; in vidtv_psi_sdt_table_init()
1283 sdt->header.one2 = ONES; in vidtv_psi_sdt_table_init()
1284 sdt->header.section_id = 0; in vidtv_psi_sdt_table_init()
1285 sdt->header.last_section = 0; in vidtv_psi_sdt_table_init()
1294 sdt->network_id = cpu_to_be16(network_id); in vidtv_psi_sdt_table_init()
1295 sdt->reserved = RESERVED; in vidtv_psi_sdt_table_init()
1305 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1306 .dest_offset = args->offset, in vidtv_psi_sdt_write_into()
1307 .h = &args->sdt->header, in vidtv_psi_sdt_write_into()
1309 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1312 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1318 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1321 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1323 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1326 .dest_buf = args->buf, in vidtv_psi_sdt_write_into()
1328 .dest_buf_sz = args->buf_sz, in vidtv_psi_sdt_write_into()
1330 struct vidtv_psi_table_sdt_service *service = args->sdt->service; in vidtv_psi_sdt_write_into()
1337 vidtv_psi_sdt_table_update_sec_len(args->sdt); in vidtv_psi_sdt_write_into()
1339 h_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1344 psi_args.from = &args->sdt->network_id; in vidtv_psi_sdt_write_into()
1345 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1346 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1353 psi_args.len = sizeof(struct vidtv_psi_table_sdt_service) - in vidtv_psi_sdt_write_into()
1354 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_sdt_write_into()
1360 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1361 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1365 service_desc = service->descriptor; in vidtv_psi_sdt_write_into()
1369 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1371 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1376 service_desc = service_desc->next; in vidtv_psi_sdt_write_into()
1379 service = service->next; in vidtv_psi_sdt_write_into()
1382 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_sdt_write_into()
1384 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_sdt_write_into()
1394 vidtv_psi_sdt_service_destroy(sdt->service); in vidtv_psi_sdt_table_destroy()
1416 service->service_id = cpu_to_be16(service_id); in vidtv_psi_sdt_service_init()
1417 service->EIT_schedule = eit_schedule; in vidtv_psi_sdt_service_init()
1418 service->EIT_present_following = eit_present_following; in vidtv_psi_sdt_service_init()
1419 service->reserved = 0x3f; in vidtv_psi_sdt_service_init()
1421 service->bitfield = cpu_to_be16(RUNNING << 13); in vidtv_psi_sdt_service_init()
1424 while (head->next) in vidtv_psi_sdt_service_init()
1425 head = head->next; in vidtv_psi_sdt_service_init()
1427 head->next = service; in vidtv_psi_sdt_service_init()
1441 curr = curr->next; in vidtv_psi_sdt_service_destroy()
1442 vidtv_psi_desc_destroy(tmp->descriptor); in vidtv_psi_sdt_service_destroy()
1452 if (service == sdt->service) in vidtv_psi_sdt_service_assign()
1455 sdt->service = service; in vidtv_psi_sdt_service_assign()
1461 } while (vidtv_psi_get_sec_len(&sdt->header) > MAX_SECTION_LEN); in vidtv_psi_sdt_service_assign()
1463 vidtv_psi_update_version_num(&sdt->header); in vidtv_psi_sdt_service_assign()
1484 program = pat->program; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1486 if (program->service_id) in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1488 program = program->next; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1497 for (program = pat->program; program; program = program->next) { in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1498 if (!program->service_id) in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1500 pmt_secs[i] = vidtv_psi_pmt_table_init(be16_to_cpu(program->service_id), in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1505 i--; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1512 pat->num_pmt = num_pmt; in vidtv_psi_pmt_create_sec_for_each_pat_entry()
1528 if (be16_to_cpu(sec->header.id) == program_num) in vidtv_psi_find_pmt_sec()
1538 struct vidtv_psi_table_transport *t = nit->transport; in vidtv_psi_nit_table_update_sec_len()
1548 desc_loop_len = vidtv_psi_desc_comp_loop_len(nit->descriptor); in vidtv_psi_nit_table_update_sec_len()
1549 vidtv_psi_set_desc_loop_len(&nit->bitfield, desc_loop_len, 12); in vidtv_psi_nit_table_update_sec_len()
1557 transport_loop_len += sizeof(struct vidtv_psi_table_transport) - in vidtv_psi_nit_table_update_sec_len()
1558 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_nit_table_update_sec_len()
1563 desc_loop_len = vidtv_psi_desc_comp_loop_len(t->descriptor); in vidtv_psi_nit_table_update_sec_len()
1564 vidtv_psi_set_desc_loop_len(&t->bitfield, desc_loop_len, 12); in vidtv_psi_nit_table_update_sec_len()
1568 t = t->next; in vidtv_psi_nit_table_update_sec_len()
1572 vidtv_psi_set_desc_loop_len(&nit->bitfield2, transport_loop_len, 12); in vidtv_psi_nit_table_update_sec_len()
1575 vidtv_psi_set_sec_len(&nit->header, length); in vidtv_psi_nit_table_update_sec_len()
1598 nit->header.table_id = 0x40; // ACTUAL_NETWORK in vidtv_psi_nit_table_init()
1600 nit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12)); in vidtv_psi_nit_table_init()
1602 nit->header.id = cpu_to_be16(network_id); in vidtv_psi_nit_table_init()
1603 nit->header.current_next = ONE; in vidtv_psi_nit_table_init()
1605 nit->header.version = 0x1f; in vidtv_psi_nit_table_init()
1607 nit->header.one2 = ONES; in vidtv_psi_nit_table_init()
1608 nit->header.section_id = 0; in vidtv_psi_nit_table_init()
1609 nit->header.last_section = 0; in vidtv_psi_nit_table_init()
1611 nit->bitfield = cpu_to_be16(0xf); in vidtv_psi_nit_table_init()
1612 nit->bitfield2 = cpu_to_be16(0xf); in vidtv_psi_nit_table_init()
1614 nit->descriptor = (struct vidtv_psi_desc *) in vidtv_psi_nit_table_init()
1616 if (!nit->descriptor) in vidtv_psi_nit_table_init()
1619 transport->transport_id = cpu_to_be16(transport_stream_id); in vidtv_psi_nit_table_init()
1620 transport->network_id = cpu_to_be16(network_id); in vidtv_psi_nit_table_init()
1621 transport->bitfield = cpu_to_be16(0xf); in vidtv_psi_nit_table_init()
1622 transport->descriptor = (struct vidtv_psi_desc *) in vidtv_psi_nit_table_init()
1624 if (!transport->descriptor) in vidtv_psi_nit_table_init()
1627 nit->transport = transport; in vidtv_psi_nit_table_init()
1634 vidtv_psi_desc_destroy((struct vidtv_psi_desc *)nit->descriptor); in vidtv_psi_nit_table_init()
1646 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1647 .dest_offset = args->offset, in vidtv_psi_nit_write_into()
1648 .h = &args->nit->header, in vidtv_psi_nit_write_into()
1650 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1653 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1654 .from = &args->nit->bitfield, in vidtv_psi_nit_write_into()
1659 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1662 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1664 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1667 .dest_buf = args->buf, in vidtv_psi_nit_write_into()
1669 .dest_buf_sz = args->buf_sz, in vidtv_psi_nit_write_into()
1671 struct vidtv_psi_desc *table_descriptor = args->nit->descriptor; in vidtv_psi_nit_write_into()
1672 struct vidtv_psi_table_transport *transport = args->nit->transport; in vidtv_psi_nit_write_into()
1677 vidtv_psi_nit_table_update_sec_len(args->nit); in vidtv_psi_nit_write_into()
1679 h_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1686 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1687 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1694 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1696 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1701 table_descriptor = table_descriptor->next; in vidtv_psi_nit_write_into()
1705 psi_args.from = &args->nit->bitfield2; in vidtv_psi_nit_write_into()
1707 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1717 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1721 transport_descriptor = transport->descriptor; in vidtv_psi_nit_write_into()
1725 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1727 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1732 transport_descriptor = transport_descriptor->next; in vidtv_psi_nit_write_into()
1735 transport = transport->next; in vidtv_psi_nit_write_into()
1738 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_nit_write_into()
1740 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_nit_write_into()
1755 curr_t = curr_t->next; in vidtv_psi_transport_destroy()
1756 vidtv_psi_desc_destroy(tmp_t->descriptor); in vidtv_psi_transport_destroy()
1763 vidtv_psi_desc_destroy(nit->descriptor); in vidtv_psi_nit_table_destroy()
1764 vidtv_psi_transport_destroy(nit->transport); in vidtv_psi_nit_table_destroy()
1770 struct vidtv_psi_table_eit_event *e = eit->event; in vidtv_psi_eit_table_update_sec_len()
1782 length += sizeof(struct vidtv_psi_table_eit_event) - in vidtv_psi_eit_table_update_sec_len()
1783 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_eit_table_update_sec_len()
1786 desc_loop_len = vidtv_psi_desc_comp_loop_len(e->descriptor); in vidtv_psi_eit_table_update_sec_len()
1787 vidtv_psi_set_desc_loop_len(&e->bitfield, desc_loop_len, 12); in vidtv_psi_eit_table_update_sec_len()
1791 e = e->next; in vidtv_psi_eit_table_update_sec_len()
1796 vidtv_psi_set_sec_len(&eit->header, length); in vidtv_psi_eit_table_update_sec_len()
1803 if (e == eit->event) in vidtv_psi_eit_event_assign()
1806 eit->event = e; in vidtv_psi_eit_event_assign()
1810 } while (vidtv_psi_get_sec_len(&eit->header) > EIT_MAX_SECTION_LEN); in vidtv_psi_eit_event_assign()
1812 vidtv_psi_update_version_num(&eit->header); in vidtv_psi_eit_event_assign()
1829 eit->header.table_id = 0x4e; //actual_transport_stream: present/following in vidtv_psi_eit_table_init()
1831 eit->header.bitfield = cpu_to_be16((SYNTAX << 15) | (ONE << 14) | (ONES << 12)); in vidtv_psi_eit_table_init()
1833 eit->header.id = service_id; in vidtv_psi_eit_table_init()
1834 eit->header.current_next = ONE; in vidtv_psi_eit_table_init()
1836 eit->header.version = 0x1f; in vidtv_psi_eit_table_init()
1838 eit->header.one2 = ONES; in vidtv_psi_eit_table_init()
1839 eit->header.section_id = 0; in vidtv_psi_eit_table_init()
1840 eit->header.last_section = 0; in vidtv_psi_eit_table_init()
1842 eit->transport_id = cpu_to_be16(transport_stream_id); in vidtv_psi_eit_table_init()
1843 eit->network_id = cpu_to_be16(network_id); in vidtv_psi_eit_table_init()
1845 eit->last_segment = eit->header.last_section; /* not implemented */ in vidtv_psi_eit_table_init()
1846 eit->last_table_id = eit->header.table_id; /* not implemented */ in vidtv_psi_eit_table_init()
1856 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1857 .dest_offset = args->offset, in vidtv_psi_eit_write_into()
1858 .h = &args->eit->header, in vidtv_psi_eit_write_into()
1860 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1863 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1871 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1874 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1876 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1879 .dest_buf = args->buf, in vidtv_psi_eit_write_into()
1881 .dest_buf_sz = args->buf_sz, in vidtv_psi_eit_write_into()
1883 struct vidtv_psi_table_eit_event *event = args->eit->event; in vidtv_psi_eit_write_into()
1888 vidtv_psi_eit_table_update_sec_len(args->eit); in vidtv_psi_eit_write_into()
1890 h_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1895 psi_args.from = &args->eit->transport_id; in vidtv_psi_eit_write_into()
1896 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1897 psi_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1903 psi_args.len = sizeof(struct vidtv_psi_table_eit_event) - in vidtv_psi_eit_write_into()
1904 sizeof(struct vidtv_psi_desc *) - in vidtv_psi_eit_write_into()
1909 psi_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1913 event_descriptor = event->descriptor; in vidtv_psi_eit_write_into()
1917 d_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1919 d_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1924 event_descriptor = event_descriptor->next; in vidtv_psi_eit_write_into()
1927 event = event->next; in vidtv_psi_eit_write_into()
1930 c_args.dest_offset = args->offset + nbytes; in vidtv_psi_eit_write_into()
1932 c_args.continuity_counter = args->continuity_counter; in vidtv_psi_eit_write_into()
1947 int mjd, l; in vidtv_psi_eit_event_init() local
1954 e->event_id = cpu_to_be16(event_id); in vidtv_psi_eit_event_init()
1959 /* Convert date to Modified Julian Date - per EN 300 468 Annex C */ in vidtv_psi_eit_event_init()
1961 l = 1; in vidtv_psi_eit_event_init()
1963 l = 0; in vidtv_psi_eit_event_init()
1966 mjd += (time.tm_year - l) * 36525 / 100; in vidtv_psi_eit_event_init()
1967 mjd += (time.tm_mon + 2 + l * 12) * 306001 / 10000; in vidtv_psi_eit_event_init()
1975 memcpy(e->start_time, &mjd_be, sizeof(mjd_be)); in vidtv_psi_eit_event_init()
1976 e->start_time[2] = bin2bcd(time.tm_hour); in vidtv_psi_eit_event_init()
1977 e->start_time[3] = 0; in vidtv_psi_eit_event_init()
1978 e->start_time[4] = 0; in vidtv_psi_eit_event_init()
1987 memcpy(e->duration, DURATION, sizeof(e->duration)); in vidtv_psi_eit_event_init()
1989 e->bitfield = cpu_to_be16(RUNNING << 13); in vidtv_psi_eit_event_init()
1992 while (head->next) in vidtv_psi_eit_event_init()
1993 head = head->next; in vidtv_psi_eit_event_init()
1995 head->next = e; in vidtv_psi_eit_event_init()
2008 curr_e = curr_e->next; in vidtv_psi_eit_event_destroy()
2009 vidtv_psi_desc_destroy(tmp_e->descriptor); in vidtv_psi_eit_event_destroy()
2016 vidtv_psi_eit_event_destroy(eit->event); in vidtv_psi_eit_table_destroy()