/* * GPAC - Multimedia Framework C SDK * * Authors: Jean Le Feuvre * Copyright (c) Telecom ParisTech 2007-2012 * All rights reserved * * This file is part of GPAC / mpedemux application * * GPAC is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * GPAC 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; see the file COPYING. If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include <gpac/mpegts.h> typedef struct { FILE *ts_file; GF_M2TS_Demuxer *ts_demux; } MPEDemux; static void mpedemux_on_event(GF_M2TS_Demuxer *ts, u32 evt_type, void *param) { MPEDemux *mpedemux= (MPEDemux *) ts->user; switch (evt_type) { case GF_M2TS_EVT_PAT_FOUND: /* called when the first PAT is fully parsed */ break; case GF_M2TS_EVT_SDT_FOUND: /* called when the first SDT is fully parsed */ break; case GF_M2TS_EVT_PMT_FOUND: /* called when a first PMT is fully parsed */ break; case GF_M2TS_EVT_INT_FOUND: /* called when a first INT is fully parsed */ /* TODO: create socket for each target in the IP platform */ break; case GF_M2TS_EVT_PAT_UPDATE: case GF_M2TS_EVT_PMT_UPDATE: case GF_M2TS_EVT_SDT_UPDATE: /* called when a new version of the table is parsed */ break; case GF_M2TS_EVT_PES_PCK: /* called when a PES packet is parsed */ break; case GF_M2TS_EVT_SL_PCK: /* called when an MPEG-4 SL-packet is parsed */ break; case GF_M2TS_EVT_IP_DATAGRAM: /* called when an IP packet is parsed TODO: send this packet on the right socket */ break; } } static void usage() { fprintf(stdout, "mpedemux input.ts\n"); } int main(int argc, char **argv) { u8 data[188]; u32 size; MPEDemux *mpedemux; if (argc < 2) { usage(); return GF_OK; } GF_SAFEALLOC(mpedemux, MPEDemux); mpedemux->ts_demux = gf_m2ts_demux_new(); mpedemux->ts_demux->on_event = mpedemux_on_event; mpedemux->ts_demux->user = mpedemux; mpedemux->ts_file = gf_fopen(argv[1], "rb"); while (1) { /*read chunks by chunks*/ size = fread(data, 1, 188, mpedemux->ts_file); if (!size) break; /*process chunk*/ gf_m2ts_process_data(mpedemux->ts_demux, data, size); } gf_m2ts_demux_del(mpedemux->ts_demux); gf_free(mpedemux); return GF_OK; }