static void dump_pmt (GstMpegtsSection * section, ATS_METADATA* data) { const GstMpegtsPMT *pmt = gst_mpegts_section_get_pmt (section); guint i, len; ATS_CH_DATA* channel; channel = ats_metadata_find_channel(data, pmt->program_number); if (!channel) return; len = pmt->streams->len; channel->pids_num = 0; for (i = 0; i < len; i++) { const gchar* type; GstMpegtsPMTStream *stream = g_ptr_array_index (pmt->streams, i); if (stream->stream_type == 0x86) continue; /* Unknown type */ /* Getting pid's codec type */ type = enum_name (GST_TYPE_MPEGTS_STREAM_TYPE, stream->stream_type); if (type[0] != 'a' && type[0] != 'v') continue; channel->pids[channel->pids_num].to_be_analyzed = FALSE; channel->pids[channel->pids_num].pid = stream->pid; channel->pids[channel->pids_num].type = stream->stream_type; channel->pids[channel->pids_num].codec = g_strdup(type); channel->pids_num++; } }
static void dump_pmt (GstMpegTsSection * section) { const GstMpegTsPMT *pmt = gst_mpegts_section_get_pmt (section); guint i, len; g_printf (" program_number : 0x%04x\n", section->subtable_extension); g_printf (" pcr_pid : 0x%04x\n", pmt->pcr_pid); dump_descriptors (pmt->descriptors, 7); len = pmt->streams->len; g_printf (" %d Streams:\n", len); for (i = 0; i < len; i++) { GstMpegTsPMTStream *stream = g_ptr_array_index (pmt->streams, i); g_printf (" pid:0x%04x , stream_type:0x%02x (%s)\n", stream->pid, stream->stream_type, enum_name (GST_TYPE_MPEG_TS_STREAM_TYPE, stream->stream_type)); dump_descriptors (stream->descriptors, 9); } }
static void dvb_base_bin_pmt_info_cb (DvbBaseBin * dvbbasebin, GstMpegtsSection * section) { const GstMpegtsPMT *pmt; DvbBaseBinProgram *program; guint program_number; pmt = gst_mpegts_section_get_pmt (section); if (G_UNLIKELY (pmt == NULL)) { GST_WARNING_OBJECT (dvbbasebin, "Received invalid PMT"); return; } program_number = section->subtable_extension; program = dvb_base_bin_get_program (dvbbasebin, program_number); if (program == NULL) { GST_WARNING ("got PMT for program %d but program not in PAT", program_number); program = dvb_base_bin_add_program (dvbbasebin, program_number); } program->old_pmt = program->pmt; program->old_section = program->section; program->pmt = pmt; program->section = gst_mpegts_section_ref (section); /* activate the program if it's selected and either it's not active or its pmt * changed */ if (program->selected && (!program->active || program->old_pmt != NULL)) dvb_base_bin_activate_program (dvbbasebin, program); if (program->old_pmt) { gst_mpegts_section_unref (program->old_section); program->old_pmt = NULL; } }
static gboolean mpegts_base_apply_pmt (MpegTSBase * base, GstMpegtsSection * section) { const GstMpegtsPMT *pmt; MpegTSBaseProgram *program, *old_program; guint program_number; gboolean initial_program = TRUE; pmt = gst_mpegts_section_get_pmt (section); if (G_UNLIKELY (pmt == NULL)) { GST_ERROR ("Could not get PMT (corrupted ?)"); return FALSE; } /* FIXME : not so sure this is valid anymore */ if (G_UNLIKELY (base->seen_pat == FALSE)) { GST_WARNING ("Got pmt without pat first. Returning"); /* remove the stream since we won't get another PMT otherwise */ mpegts_packetizer_remove_stream (base->packetizer, section->pid); return TRUE; } program_number = section->subtable_extension; GST_DEBUG ("Applying PMT (program_number:%d, pid:0x%04x)", program_number, section->pid); /* In order for stream switching to happen properly in decodebin(2), * we need to first add the new pads (i.e. activate the new program) * before removing the old ones (i.e. deactivating the old program) */ old_program = mpegts_base_get_program (base, program_number); if (G_UNLIKELY (old_program == NULL)) goto no_program; if (G_UNLIKELY (mpegts_base_is_same_program (base, old_program, section->pid, pmt))) goto same_program; /* If the current program is active, this means we have a new program */ if (old_program->active) { MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base); old_program = mpegts_base_steal_program (base, program_number); program = mpegts_base_new_program (base, program_number, section->pid); program->patcount = old_program->patcount; g_hash_table_insert (base->programs, GINT_TO_POINTER (program_number), program); /* Desactivate the old program */ /* FIXME : THIS IS BREAKING THE STREAM SWITCHING LOGIC ! * */ if (klass->can_remove_program (base, old_program)) { mpegts_base_deactivate_program (base, old_program); mpegts_base_free_program (old_program); } initial_program = FALSE; } else program = old_program; /* activate program */ /* Ownership of pmt_info is given to the program */ mpegts_base_activate_program (base, program, section->pid, section, pmt, initial_program); return TRUE; no_program: { GST_ERROR ("Attempted to apply a PMT on a program that wasn't created"); return TRUE; } same_program: { GST_DEBUG ("Not applying identical program"); return TRUE; } }