mpegtsmux: Set the program number from prog-map

The prog-map property of mpegtsmux only allows you to group pids together in a program.
The program number set in the PAT/PMT tables cannot be set explicitly.

This patch will set the program number according to the prog-map.
If a program id of 0 is given, the first vacant program number starting from 1 will be used.

https://bugzilla.gnome.org/show_bug.cgi?id=697239
This commit is contained in:
Jesper Larsen 2013-03-10 17:02:18 +01:00 committed by Edward Hervey
parent c3e4fe4edc
commit e4a0c4d509
3 changed files with 24 additions and 5 deletions

View file

@ -738,7 +738,7 @@ mpegtsmux_create_streams (MpegTsMux * mux)
ts_data->prog = mux->programs[ts_data->prog_id];
if (ts_data->prog == NULL) {
ts_data->prog = tsmux_program_new (mux->tsmux);
ts_data->prog = tsmux_program_new (mux->tsmux, ts_data->prog_id);
if (ts_data->prog == NULL)
goto no_program;
tsmux_set_pmt_interval (ts_data->prog, mux->pmt_interval);

View file

@ -247,6 +247,12 @@ tsmux_free (TsMux * mux)
g_slice_free (TsMux, mux);
}
static gint
tsmux_program_compare (TsMuxProgram * program, gint * needle)
{
return (program->pgm_number - *needle);
}
/**
* tsmux_program_new:
* @mux: a #TsMux
@ -257,7 +263,7 @@ tsmux_free (TsMux * mux)
* been reached.
*/
TsMuxProgram *
tsmux_program_new (TsMux * mux)
tsmux_program_new (TsMux * mux, gint prog_id)
{
TsMuxProgram *program;
@ -273,7 +279,20 @@ tsmux_program_new (TsMux * mux)
program->last_pmt_ts = -1;
program->pmt_interval = TSMUX_DEFAULT_PMT_INTERVAL;
program->pgm_number = mux->next_pgm_no++;
if (prog_id == 0) {
program->pgm_number = mux->next_pgm_no++;
while (g_list_find_custom (mux->programs, &program->pgm_number,
(GCompareFunc) tsmux_program_compare) != NULL) {
program->pgm_number = mux->next_pgm_no++;
}
} else {
program->pgm_number = prog_id;
while (g_list_find_custom (mux->programs, &program->pgm_number,
(GCompareFunc) tsmux_program_compare) != NULL) {
program->pgm_number++;
}
}
program->pmt_pid = mux->next_pmt_pid++;
program->pcr_stream = NULL;

View file

@ -183,7 +183,7 @@ guint tsmux_get_pat_interval (TsMux *mux);
guint16 tsmux_get_new_pid (TsMux *mux);
/* pid/program management */
TsMuxProgram * tsmux_program_new (TsMux *mux);
TsMuxProgram * tsmux_program_new (TsMux *mux, gint prog_id);
void tsmux_program_free (TsMuxProgram *program);
void tsmux_set_pmt_interval (TsMuxProgram *program, guint interval);
guint tsmux_get_pmt_interval (TsMuxProgram *program);