tvhtrace(LS_PARSER, "mpeg audio version change %02d: val=%d (old=%d)",
st->es_index, layer, st->es_audio_version);
st->es_audio_version = layer;
- atomic_set(&st->es_service->s_pending_restart, 1);
+ service_update_elementary_stream(st->es_service, (elementary_stream_t *)st);
}
makeapkt(t, st, buf + i, fsize, dts, duration,
channels, mpa_sri[(buf[i+2] >> 2) & 3]);
st->es_width = width;
st->es_height = height;
st->es_frame_duration = duration;
- service_request_save(st->es_service);
- atomic_set(&st->es_service->s_pending_restart, 1);
+ service_update_elementary_stream(st->es_service, (elementary_stream_t *)st);
}
}
descrambler_service_start(t);
}
+/**
+ * Update one elementary stream from the parser.
+ * The update should be handled only for the live streaming.
+ */
+void
+service_update_elementary_stream(service_t *t, elementary_stream_t *src)
+{
+ elementary_stream_t *es;
+ int change = 0, restart = 0;
+
+ es = elementary_stream_find(&t->s_components, src->es_pid);
+ if (es == NULL)
+ return;
+
+ # define _CHANGE(field) \
+ if (es->field != src->field) { es->field = src->field; change++; }
+ # define _RESTART(field) \
+ if (es->field != src->field) { es->field = src->field; restart++; }
+
+ _CHANGE(es_frame_duration);
+ _RESTART(es_width);
+ _RESTART(es_height);
+ _CHANGE(es_aspect_num);
+ _CHANGE(es_aspect_den);
+ _RESTART(es_audio_version);
+ _RESTART(es_sri);
+ _RESTART(es_ext_sri);
+ _CHANGE(es_channels);
+
+ # undef _CHANGE
+ # undef _RESTART
+
+ if (change || restart)
+ service_request_save(t);
+ if (restart)
+ atomic_set(&t->s_pending_restart, 1);
+}
+
/**
*
*/
void service_request_save(service_t *t);
+void service_update_elementary_stream(service_t *t, elementary_stream_t *src);
+
void service_source_info_free(source_info_t *si);
void service_source_info_copy(source_info_t *dst, const source_info_t *src);