diff --git a/src/input/mpegts/tsfile/rawts_input.h b/src/input/mpegts/tsfile/rawts_input.h deleted file mode 100644 index a52d33d0..00000000 --- a/src/input/mpegts/tsfile/rawts_input.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Tvheadend - TS file based input (debugging) - * - * Copyright (C) 2013 Adam Sutton - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef __TVH_TSFILE_INPUT_H__ -#define __TVH_TSFILE_INPUT_H__ - -typedef struct tsfile_input -{ - - -} tsfile_input_t; - -#endif /* __TVH_TSFILE_INPUT_H__ */ - -/****************************************************************************** - * Editor Configuration - * - * vim:sts=2:ts=2:sw=2:et - *****************************************************************************/ diff --git a/src/input/mpegts/tsfile/rawtsinput.c b/src/input/mpegts/tsfile/rawtsinput.c deleted file mode 100644 index 905cdcaa..00000000 --- a/src/input/mpegts/tsfile/rawtsinput.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Raw TS input (for debugging) - * Copyright (C) 2009 Andreas Ă–man - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#define _XOPEN_SOURCE 600 // for clock_nanosleep() - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tvheadend.h" -#include "rawtsinput.h" -#include "psi.h" -#include "tsdemux.h" -#include "channels.h" - -typedef struct rawts { - int rt_fd; - - char *rt_identifier; - psi_section_t rt_pat; - - struct service_list rt_services; - - int rt_pcr_pid; - -} rawts_t; - - -const idclass_t rawts_class = { - .ic_super = &service_class, - .ic_class = "rawts", -}; - -/** - * - */ -static int -rawts_service_start(service_t *t, int id) -{ - return 0; // Always ok -} - -/** - * - */ -static void -rawts_service_stop(service_t *t) -{ -} - -/** - * - */ -static void -rawts_service_save(service_t *t) -{ - htsmsg_t *m = htsmsg_create_map(); - - pthread_mutex_lock(&t->s_stream_mutex); - psi_save_service_settings(m, t); - pthread_mutex_unlock(&t->s_stream_mutex); - - //htsmsg_print(m); - htsmsg_destroy(m); - -} - -/** - * - */ -static int -rawts_service_is_enabled(service_t *t) -{ - return 1; -} - - -/** - * Generate a descriptive name for the source - */ -static void -rawts_service_setsourceinfo(service_t *t, struct source_info *si) -{ - memset(si, 0, sizeof(struct source_info)); -} - - - -/** - * - */ -static service_t * -rawts_service_add(rawts_t *rt, uint16_t sid, int pmt_pid) -{ - service_t *t; - struct channel *ch; - - char tmp[200]; - - LIST_FOREACH(t, &rt->rt_services, s_group_link) { - if(t->s_dvb_service_id == sid) - return t; - } - - snprintf(tmp, sizeof(tmp), "%s_%04x", rt->rt_identifier, sid); - - t = service_create(NULL, S_MPEG_TS, &rawts_class); - t->s_flags |= S_DEBUG; - - t->s_dvb_service_id = sid; - t->s_pmt_pid = pmt_pid; - - t->s_start_feed = rawts_service_start; - t->s_stop_feed = rawts_service_stop; - t->s_config_save = rawts_service_save; - t->s_setsourceinfo = rawts_service_setsourceinfo; - t->s_is_enabled = rawts_service_is_enabled; - - t->s_svcname = strdup(tmp); - - pthread_mutex_lock(&t->s_stream_mutex); - service_make_nicename(t); - pthread_mutex_unlock(&t->s_stream_mutex); - - tvhlog(LOG_NOTICE, "rawts", "Added service %d (pmt: %d)", sid, pmt_pid); - - LIST_INSERT_HEAD(&rt->rt_services, t, s_group_link); - - ch = channel_find_by_name(tmp, 1, 0); - - service_map_channel(t, ch, 0); - return t; -} - - -/* - * - */ - -static void -got_pmt(struct service *t, elementary_stream_t *st, - const uint8_t *table, int table_len) -{ - if(table[0] != 2) - return; - - pthread_mutex_lock(&global_lock); - psi_parse_pmt(t, table + 3, table_len - 3, 1, 1); - pthread_mutex_unlock(&global_lock); -} - - - -/** - * - */ -static void -got_pat(const uint8_t *ptr, size_t len, void *opaque) -{ - rawts_t *rt = opaque; - service_t *t; - elementary_stream_t *st; - uint16_t prognum; - uint16_t pid; - - len -= 8; - ptr += 8; - - if(len <= 0) - return; - - pthread_mutex_lock(&global_lock); - - while(len >= 4) { - - prognum = ptr[0] << 8 | ptr[1]; - pid = (ptr[2] & 0x1f) << 8 | ptr[3]; - - if(prognum != 0) { - t = rawts_service_add(rt, prognum, pid); - - if(t != NULL) { - pthread_mutex_lock(&t->s_stream_mutex); - - if(service_stream_find(t, pid) == NULL) { - st = service_stream_create(t, pid, SCT_PMT); - st->es_section_docrc = 1; - st->es_got_section = got_pmt; - } - pthread_mutex_unlock(&t->s_stream_mutex); - } - } - ptr += 4; - len -= 4; - } - pthread_mutex_unlock(&global_lock); -} - -/** - * - */ -static void -rawts_pat(rawts_t *rt, const uint8_t *tsb) -{ - psi_section_reassemble(&rt->rt_pat, tsb, 1, got_pat, rt); -} - - -/** - * - */ -static void -process_ts_packet(rawts_t *rt, uint8_t *tsb) -{ - uint16_t pid; - service_t *t; - int64_t pcr, d; - int didsleep = 0; - - pid = ((tsb[1] & 0x1f) << 8) | tsb[2]; - if(pid == 0) { - /* PAT */ - rawts_pat(rt, tsb); - return; - } - - LIST_FOREACH(t, &rt->rt_services, s_group_link) { - pcr = PTS_UNSET; - - ts_recv_packet1(t, tsb, &pcr); - - if(pcr != PTS_UNSET) { - - if(rt->rt_pcr_pid == 0) - rt->rt_pcr_pid = pid; - - if(rt->rt_pcr_pid == pid) { - if(t->s_pcr_last != PTS_UNSET && didsleep == 0) { - struct timespec slp; - int64_t delta = pcr - t->s_pcr_last; - - - - if(delta > 90000) - delta = 90000; - delta *= 11; - d = delta + t->s_pcr_last_realtime; - slp.tv_sec = d / 1000000; - slp.tv_nsec = (d % 1000000) * 1000; - - clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &slp, NULL); - didsleep = 1; - } - t->s_pcr_last = pcr; - t->s_pcr_last_realtime = getmonoclock(); - } - } - } -} - - -/** - * - */ -static void * -raw_ts_reader(void *aux) -{ - rawts_t *rt = aux; - uint8_t tsblock[188]; - struct timespec tm = {0, 0}; - int c = 0; - int i; - - while(1) { - - for(i = 0; i < 2; i++) { - if(read(rt->rt_fd, tsblock, 188) != 188) { - lseek(rt->rt_fd, 0, SEEK_SET); - continue; - } - c++; - process_ts_packet(rt, tsblock); - } - nanosleep(&tm, NULL); - } - - return NULL; -} - - -/** - * - */ -void -rawts_init(const char *filename) -{ - pthread_t ptid; - rawts_t *rt; - int fd = tvh_open(filename, O_RDONLY, 0); - - if(fd == -1) { - fprintf(stderr, "Unable to open %s -- %s\n", filename, strerror(errno)); - return; - } - - rt = calloc(1, sizeof(rawts_t)); - rt->rt_fd = fd; - - rt->rt_identifier = strdup("rawts"); - - pthread_create(&ptid, NULL, raw_ts_reader, rt); -} diff --git a/src/input/mpegts/tsfile/rawtsinput.h b/src/input/mpegts/tsfile/rawtsinput.h deleted file mode 100644 index d007a632..00000000 --- a/src/input/mpegts/tsfile/rawtsinput.h +++ /dev/null @@ -1,4 +0,0 @@ - - -void rawts_init(const char *filename); -