diff options
author | Julien Isorce <julien.isorce@gmail.com> | 2009-09-04 12:08:45 +0200 |
---|---|---|
committer | Julien Isorce <julien.isorce@gmail.com> | 2009-09-04 12:08:45 +0200 |
commit | e7f883a272fc50742862a7b458720c16530a0c76 (patch) | |
tree | 7b1358975eb410aa7da2ccce61fc010c40a65bdd | |
parent | d321799bfbb3d350bfeb8f2bffa088f4788ae7f0 (diff) | |
parent | c67dc212bfc4f1ef2bbcbd29096f1ae29036d854 (diff) |
Merge branch 'master' of ssh://cap@git.freedesktop.org/git/gstreamer/gst-plugins-bad
-rw-r--r-- | gst/mpegdemux/gstmpegdefs.h | 4 | ||||
-rw-r--r-- | gst/mpegdemux/gstmpegdesc.h | 4 | ||||
-rw-r--r-- | gst/mpegdemux/gstmpegtsdemux.c | 34 |
3 files changed, 36 insertions, 6 deletions
diff --git a/gst/mpegdemux/gstmpegdefs.h b/gst/mpegdemux/gstmpegdefs.h index 35ee967bf..ef2bd46a4 100644 --- a/gst/mpegdemux/gstmpegdefs.h +++ b/gst/mpegdemux/gstmpegdefs.h @@ -185,8 +185,8 @@ #define ST_BD_SECONDARY_AC3_PLUS 0xa1 #define ST_BD_SECONDARY_DTS_HD 0xa2 -/* VC1 extension */ -#define ST_VIDEO_VC1 0xea +/* defined for VC1 extension in RP227 */ +#define ST_PRIVATE_EA 0xea /* HDV AUX stream mapping * 0xA0 ISO/IEC 61834-11 diff --git a/gst/mpegdemux/gstmpegdesc.h b/gst/mpegdemux/gstmpegdesc.h index 71b74aa2d..09a9a7c6c 100644 --- a/gst/mpegdemux/gstmpegdesc.h +++ b/gst/mpegdemux/gstmpegdesc.h @@ -319,6 +319,10 @@ /* DVB Carousel Identifier Descriptor */ #define DESC_DVB_CAROUSEL_IDENTIFIER_carousel_id(desc) (GST_READ_UINT32_BE((desc) + 2)) +/* registration_descriptor format IDs */ +#define DRF_ID_HDMV 0x48444d56 +#define DRF_ID_VC1 0x56432D31 /* defined in RP227 */ + typedef struct { guint n_desc; guint8 data_length; diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c index 14cddfea0..f6d3b1171 100644 --- a/gst/mpegdemux/gstmpegtsdemux.c +++ b/gst/mpegdemux/gstmpegtsdemux.c @@ -206,6 +206,9 @@ static MpegTsPmtInfo *mpegts_demux_build_pmt_info (GstMpegTSDemux * demux, static GstElementClass *parent_class = NULL; +static FORCE_INLINE GstMpegTSStream + * gst_mpegts_demux_get_stream_for_PID (GstMpegTSDemux * demux, guint16 PID); + /*static guint gst_mpegts_demux_signals[LAST_SIGNAL] = { 0 };*/ GType @@ -563,7 +566,6 @@ gst_mpegts_stream_is_video (GstMpegTSStream * stream) case ST_VIDEO_MPEG2: case ST_VIDEO_MPEG4: case ST_VIDEO_H264: - case ST_VIDEO_VC1: return TRUE; case ST_VIDEO_DIRAC: return gst_mpegts_is_dirac_stream (stream); @@ -660,7 +662,16 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, caps = gst_caps_new_simple ("video/x-dirac", NULL); } break; - case ST_VIDEO_VC1: + case ST_PRIVATE_EA: /* Try to detect a VC1 stream */ + { + guint8 *desc = NULL; + + if (stream->ES_info) + desc = gst_mpeg_descriptor_find (stream->ES_info, DESC_REGISTRATION); + if (!(desc && DESC_REGISTRATION_format_identifier (desc) == DRF_ID_VC1)) { + GST_WARNING ("0xea private stream type found but no descriptor " + "for VC1. Assuming plain VC1."); + } template = klass->video_template; name = g_strdup_printf ("video_%04x", stream->PID); caps = gst_caps_new_simple ("video/x-wmv", @@ -668,8 +679,23 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('W', 'V', 'C', '1'), NULL); break; + } case ST_BD_AUDIO_AC3: - if (gst_mpeg_descriptor_find (stream->ES_info, DESC_DVB_ENHANCED_AC3)) { + { + GstMpegTSStream *PMT_stream = + gst_mpegts_demux_get_stream_for_PID (stream->demux, stream->PMT_pid); + GstMPEGDescriptor *program_info = PMT_stream->PMT.program_info; + guint8 *desc = NULL; + + if (program_info) + desc = gst_mpeg_descriptor_find (program_info, DESC_REGISTRATION); + + if (desc && DESC_REGISTRATION_format_identifier (desc) == DRF_ID_HDMV) { + template = klass->audio_template; + name = g_strdup_printf ("audio_%04x", stream->PID); + caps = gst_caps_new_simple ("audio/x-eac3", NULL); + } else if (gst_mpeg_descriptor_find (stream->ES_info, + DESC_DVB_ENHANCED_AC3)) { template = klass->audio_template; name = g_strdup_printf ("audio_%04x", stream->PID); caps = gst_caps_new_simple ("audio/x-eac3", NULL); @@ -684,6 +710,7 @@ gst_mpegts_demux_fill_stream (GstMpegTSStream * stream, guint8 id, caps = gst_caps_new_simple ("audio/x-ac3", NULL); } break; + } case ST_BD_AUDIO_EAC3: template = klass->audio_template; name = g_strdup_printf ("audio_%04x", stream->PID); @@ -2849,7 +2876,6 @@ beach: return res; } - static FORCE_INLINE gint is_mpegts_sync (const guint8 * in_data, const guint8 * end_data, guint packetsize) |