/* MPEG-PS muxer plugin for GStreamer * Copyright 2008 Lin YANG * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ /* * Unless otherwise indicated, Source Code is licensed under MIT license. * See further explanation attached in License Statement (distributed in the file * LICENSE). * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is furnished to do * so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef __MPEGPSMUX_H__ #define __MPEGPSMUX_H__ #include #include #include G_BEGIN_DECLS #include "psmux.h" #define GST_TYPE_MPEG_PSMUX (mpegpsmux_get_type()) #define GST_MPEG_PSMUX(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_MPEG_PSMUX, MpegPsMux)) typedef struct MpegPsMux MpegPsMux; typedef struct MpegPsMuxClass MpegPsMuxClass; typedef struct MpegPsPadData MpegPsPadData; typedef GstBuffer * (*MpegPsPadDataPrepareFunction) (GstBuffer * buf, MpegPsPadData * data, MpegPsMux * mux); struct MpegPsMux { GstElement parent; GstPad *srcpad; guint video_stream_id; /* stream id of primary video stream */ GstCollectPads *collect; /* pads collector */ PsMux *psmux; gboolean first; GstFlowReturn last_flow_ret; GstClockTime last_ts; GstBufferList *gop_list; gboolean aggregate_gops; }; struct MpegPsMuxClass { GstElementClass parent_class; }; struct MpegPsPadData { GstCollectData collect; /* Parent */ guint8 stream_id; guint8 stream_id_ext; PsMuxStream *stream; /* Currently pulled buffer */ struct { GstBuffer *buf; GstClockTime ts; /* adjusted TS = MIN (DTS, PTS) for the pulled buffer */ GstClockTime pts; /* adjusted PTS (running time) */ GstClockTime dts; /* adjusted DTS (running time) */ } queued; /* Most recent valid TS (DTS or PTS) for this stream */ GstClockTime last_ts; GstBuffer * codec_data; /* Optional codec data available in the caps */ MpegPsPadDataPrepareFunction prepare_func; /* Handler to prepare input data */ gboolean eos; }; GType mpegpsmux_get_type (void); #define CLOCK_BASE 9LL #define CLOCK_FREQ (CLOCK_BASE * 10000) #define GSTTIME_TO_MPEGTIME(time) \ (GST_CLOCK_TIME_IS_VALID(time) ? \ gst_util_uint64_scale ((time), CLOCK_BASE, GST_MSECOND/10) : \ -1) #define NORMAL_TS_PACKET_LENGTH 188 #define M2TS_PACKET_LENGTH 192 #define STANDARD_TIME_CLOCK 27000000 /*33 bits as 1 ie 0x1ffffffff*/ #define TWO_POW_33_MINUS1 ((0xffffffff * 2) - 1) G_END_DECLS #endif