Browse Source

Merge pull request #10 from ningpeng/master

pmt_pid is based by channel index  and mptsd can remux when pmt table changed
Georgi Chorbadzhiyski 5 years ago
parent
commit
7f84ca2262
No account linked to committer's email address
4 changed files with 26 additions and 11 deletions
  1. 2
    2
      config.c
  2. 15
    3
      data.c
  3. 3
    2
      data.h
  4. 6
    4
      input.c

+ 2
- 2
config.c View File

@@ -142,7 +142,7 @@ int config_load_channels(CONFIG *conf) {
142 142
 				}
143 143
 				// Init channel
144 144
 				if (channel == NULL) {
145
-					channel = channel_new(service_id, is_radio, id, name, source);
145
+					channel = channel_new(service_id, is_radio, id, name, source, i);
146 146
 				} else {
147 147
 					chansrc_add(channel, source);
148 148
 				}
@@ -222,7 +222,7 @@ int config_load_channels(CONFIG *conf) {
222 222
 		if (r->cookie != cookie) {
223 223
 			proxy_log(r, "Remove");
224 224
 			/* Replace channel reference with real object and instruct free_restreamer to free it */
225
-			r->channel = channel_new(r->channel->service_id, r->channel->radio, r->channel->id, r->channel->name, r->channel->source);
225
+			r->channel = channel_new(r->channel->service_id, r->channel->radio, r->channel->id, r->channel->name, r->channel->source, r->channel->index);
226 226
 			r->freechannel = 1;
227 227
 			r->dienow = 1;
228 228
 		}

+ 15
- 3
data.c View File

@@ -88,7 +88,7 @@ void chansrc_free(CHANSRC **purl) {
88 88
 	}
89 89
 };
90 90
 
91
-void chansrc_add(CHANNEL *c, char *src) {
91
+void chansrc_add(CHANNEL *c, const char *src) {
92 92
 	if (c->num_src >= MAX_CHANNEL_SOURCES-1)
93 93
 		return;
94 94
 	c->sources[c->num_src] = strdup(src);
@@ -121,15 +121,27 @@ void chansrc_set(CHANNEL *c, uint8_t src_id) {
121 121
 
122 122
 
123 123
 
124
-CHANNEL *channel_new(int service_id, int is_radio, char *id, char *name, char *source) {
124
+CHANNEL *channel_new(int service_id, int is_radio, const char *id, const char *name, const char *source, int channel_index){
125
+
126
+    if (channel_index<=0 || channel_index>=256)
127
+    {
128
+        
129
+	    LOGf("CONFIG: Error channel_new invalid index %d\n", channel_index);
130
+        return NULL;
131
+    }
132
+    //LOGf("CONFIG: ------------------channel_new() serviceid %d id %s name %s source %s index %d\n", service_id, id, name , source , channel_index);
133
+    
125 134
 	CHANNEL *c = calloc(1, sizeof(CHANNEL));
126 135
 	c->service_id = service_id;
127 136
 	c->radio = is_radio;
128
-	c->base_pid = service_id * 32; // The first pid is saved for PMT
137
+	c->index = channel_index;
138
+	c->base_pid = c->index * 32; // The first pid is saved for PMT , channel_index must > 0
129 139
 	c->pmt_pid = c->base_pid; // The first pid is saved for PMT
130 140
 	c->id = strdup(id);
131 141
 	c->name = strdup(name);
132 142
 	chansrc_add(c, source);
143
+
144
+
133 145
 	return c;
134 146
 }
135 147
 

+ 3
- 2
data.h View File

@@ -59,6 +59,7 @@ typedef struct {
59 59
 
60 60
 typedef struct {
61 61
 	/* Config */
62
+	int			index;
62 63
 	int			base_pid;
63 64
 	int			service_id;
64 65
 	int			pmt_pid;
@@ -219,7 +220,7 @@ EPG_ENTRY *	epg_new			(time_t start, int duration, char *encoding, char *event,
219 220
 void		epg_free		(EPG_ENTRY **e);
220 221
 int			epg_changed		(EPG_ENTRY *a, EPG_ENTRY *b);
221 222
 
222
-CHANNEL *	channel_new		(int service_id, int is_radio, char *id, char *name, char *source);
223
+CHANNEL *	channel_new		(int service_id, int is_radio, const char *id, const char *name, const char *source, int channel_index);
223 224
 void		channel_free	(CHANNEL **c);
224 225
 void		channel_free_epg(CHANNEL *c);
225 226
 
@@ -228,7 +229,7 @@ int is_rtp(char *url);
228 229
 
229 230
 CHANSRC *	chansrc_init	(char *url);
230 231
 void		chansrc_free	(CHANSRC **url);
231
-void		chansrc_add		(CHANNEL *c, char *src);
232
+void		chansrc_add		(CHANNEL *c, const char *src);
232 233
 void		chansrc_next	(CHANNEL *c);
233 234
 void		chansrc_set		(CHANNEL *c, uint8_t src_id);
234 235
 

+ 6
- 4
input.c View File

@@ -185,13 +185,13 @@ int process_pat(INPUT *r, uint16_t pid, uint8_t *ts_packet) {
185 185
 	
186 186
 	if (s->last_pat->initialized) {
187 187
 		if (!ts_pat_is_same(s->pat, s->last_pat)) {
188
-			proxy_log(r, "PAT changed.");
188
+			proxy_log(r, "========================PAT changed.========================");
189 189
 			return -1; // Reconnect
190 190
 		}
191 191
 		ts_pat_free(&s->last_pat);
192 192
 		s->last_pat = ts_pat_alloc();
193 193
 	}
194
-    s->last_pat = ts_pat_push_packet(s->last_pat, ts_packet);
194
+	s->last_pat = ts_pat_push_packet(s->last_pat, ts_packet);
195 195
 	if (s->pat->initialized) {
196 196
 		// PMT pid is still unknown
197 197
 		if (!s->pmt_pid) {
@@ -243,16 +243,18 @@ int process_pmt(INPUT *r, uint16_t pid, uint8_t *ts_packet) {
243 243
 
244 244
 	s->pmt = ts_pmt_push_packet(s->pmt, ts_packet);
245 245
 
246
-	s->last_pmt = ts_pmt_push_packet(s->last_pmt, ts_packet);
246
+	
247 247
 	if (s->last_pmt->initialized) {
248 248
 		if (!ts_pmt_is_same(s->pmt, s->last_pmt)) {
249
-			proxy_log(r, "PMT changed.");
249
+			proxy_log(r, "========================PMT changed.========================");
250 250
 			return -2; // Reconnect
251 251
 		}
252 252
 		ts_pmt_free(&s->last_pmt);
253 253
 		s->last_pmt = ts_pmt_alloc();
254 254
 	}
255 255
 
256
+	s->last_pmt = ts_pmt_push_packet(s->last_pmt, ts_packet);
257
+
256 258
 	if (s->pmt->initialized) {
257 259
 		if (!s->pmt_rewritten || !s->pmt_rewritten->initialized) {
258 260
 			input_rewrite_pmt(r);

Loading…
Cancel
Save