summaryrefslogtreecommitdiffstats
path: root/gst/mxf/mxfmpeg.c
diff options
context:
space:
mode:
authorSebastian Dröge <slomo@circular-chaos.org>2008-11-30 17:42:30 +0000
committerSebastian Dröge <slomo@circular-chaos.org>2008-11-30 17:42:30 +0000
commitd1242d04a1487f4db2e9b27643204332fd316b20 (patch)
tree705658c565f3283f02a6962d911b93c0a0d10e78 /gst/mxf/mxfmpeg.c
parentc6d653d945ff9527c0e9933f8fd92e0a965459d7 (diff)
downloadgst-plugins-bad-d1242d04a1487f4db2e9b27643204332fd316b20.tar.gz
gst-plugins-bad-d1242d04a1487f4db2e9b27643204332fd316b20.tar.bz2
gst-plugins-bad-d1242d04a1487f4db2e9b27643204332fd316b20.zip
gst/mxf/: Some random cleanup.
Original commit message from CVS: * gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track): * gst/mxf/mxfalaw.h: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_header_metadata_update_streams): * gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track): * gst/mxf/mxfjpeg2000.h: * gst/mxf/mxfmpeg.c: (mxf_is_mpeg_essence_track), (mxf_mpeg_es_create_caps), (mxf_mpeg_create_caps): * gst/mxf/mxfmpeg.h: Some random cleanup.
Diffstat (limited to 'gst/mxf/mxfmpeg.c')
-rw-r--r--gst/mxf/mxfmpeg.c136
1 files changed, 81 insertions, 55 deletions
diff --git a/gst/mxf/mxfmpeg.c b/gst/mxf/mxfmpeg.c
index 9c734d62..10d0373f 100644
--- a/gst/mxf/mxfmpeg.c
+++ b/gst/mxf/mxfmpeg.c
@@ -24,6 +24,7 @@
/* TODO:
* - Handle PES streams
* - Fix TS/PS demuxers to forward timestamps
+ * - Handle sound/data somehow
*/
#ifdef HAVE_CONFIG_H
@@ -195,7 +196,7 @@ void mxf_metadata_mpeg_video_descriptor_reset
}
gboolean
-mxf_is_mpeg_video_essence_track (const MXFMetadataTrack * track)
+mxf_is_mpeg_essence_track (const MXFMetadataTrack * track)
{
guint i;
@@ -243,14 +244,84 @@ static const guint8 sony_mpeg4_extradata[] = {
0x01, 0x00, 0x00
};
+static GstCaps *
+mxf_mpeg_es_create_caps (MXFMetadataGenericPackage * package,
+ MXFMetadataTrack * track, GstTagList ** tags,
+ MXFEssenceElementHandler * handler, gpointer * mapping_data,
+ MXFMetadataFileDescriptor * f,
+ MXFMetadataGenericPictureEssenceDescriptor * p,
+ MXFMetadataGenericSoundEssenceDescriptor * s,
+ MXFMetadataMPEGVideoDescriptor * d)
+{
+ GstCaps *caps = NULL;
+
+ /* SMPTE RP224 */
+ if (!p || mxf_ul_is_zero (&p->picture_essence_coding)) {
+ GST_WARNING
+ ("No picture essence descriptor or no picture essence coding defined");
+ caps =
+ gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2,
+ "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+ } else if (p->picture_essence_coding.u[0] != 0x06
+ || p->picture_essence_coding.u[1] != 0x0e
+ || p->picture_essence_coding.u[2] != 0x2b
+ || p->picture_essence_coding.u[3] != 0x34
+ || p->picture_essence_coding.u[4] != 0x04
+ || p->picture_essence_coding.u[5] != 0x01
+ || p->picture_essence_coding.u[6] != 0x01
+ || p->picture_essence_coding.u[8] != 0x04
+ || p->picture_essence_coding.u[9] != 0x01
+ || p->picture_essence_coding.u[10] != 0x02
+ || p->picture_essence_coding.u[11] != 0x02
+ || p->picture_essence_coding.u[12] != 0x01) {
+ GST_ERROR ("No MPEG picture essence coding");
+ caps = NULL;
+ } else if (p->picture_essence_coding.u[13] >= 0x01 &&
+ p->picture_essence_coding.u[13] <= 0x08) {
+ caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2,
+ "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+ } else if (p->picture_essence_coding.u[13] == 0x10) {
+ caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1,
+ "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+ } else if (p->picture_essence_coding.u[13] == 0x20) {
+ MXFLocalTag *local_tag =
+ (((MXFMetadataGenericDescriptor *) f)->other_tags) ?
+ g_hash_table_lookup (((MXFMetadataGenericDescriptor *)
+ f)->other_tags, &sony_mpeg4_extradata) : NULL;
+
+ caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4,
+ "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
+
+ if (local_tag) {
+ GstBuffer *codec_data = NULL;
+ codec_data = gst_buffer_new_and_alloc (local_tag->size);
+ memcpy (GST_BUFFER_DATA (codec_data), local_tag->data, local_tag->size);
+ gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data,
+ NULL);
+ gst_buffer_unref (codec_data);
+ }
+
+ } else {
+ GST_ERROR ("Unsupported MPEG picture essence coding 0x%02x",
+ p->picture_essence_coding.u[13]);
+ caps = NULL;
+ }
+
+ if (caps)
+ *handler = mxf_mpeg_video_handle_essence_element;
+
+ return caps;
+}
+
GstCaps *
-mxf_mpeg_video_create_caps (MXFMetadataGenericPackage * package,
+mxf_mpeg_create_caps (MXFMetadataGenericPackage * package,
MXFMetadataTrack * track, GstTagList ** tags,
MXFEssenceElementHandler * handler, gpointer * mapping_data)
{
MXFMetadataMPEGVideoDescriptor *d = NULL;
MXFMetadataFileDescriptor *f = NULL;
MXFMetadataGenericPictureEssenceDescriptor *p = NULL;
+ MXFMetadataGenericSoundEssenceDescriptor *s = NULL;
guint i;
GstCaps *caps = NULL;
@@ -277,6 +348,11 @@ mxf_mpeg_video_create_caps (MXFMetadataGenericPackage * package,
p = (MXFMetadataGenericPictureEssenceDescriptor *) track->descriptor[i];
break;
} else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type ==
+ MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR) {
+ f = track->descriptor[i];
+ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->descriptor[i];
+ break;
+ } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type ==
MXF_METADATA_FILE_DESCRIPTOR) {
f = track->descriptor[i];
}
@@ -287,62 +363,13 @@ mxf_mpeg_video_create_caps (MXFMetadataGenericPackage * package,
return NULL;
}
- *handler = mxf_mpeg_video_handle_essence_element;
/* SMPTE 381M 7 */
if (f->essence_container.u[13] == 0x04) {
GST_DEBUG ("Found MPEG ES stream");
- /* SMPTE RP224 */
- if (!p || mxf_ul_is_zero (&p->picture_essence_coding)) {
- GST_WARNING
- ("No picture essence descriptor or no picture essence coding defined");
- caps =
- gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2,
- "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
- } else if (p->picture_essence_coding.u[0] != 0x06
- || p->picture_essence_coding.u[1] != 0x0e
- || p->picture_essence_coding.u[2] != 0x2b
- || p->picture_essence_coding.u[3] != 0x34
- || p->picture_essence_coding.u[4] != 0x04
- || p->picture_essence_coding.u[5] != 0x01
- || p->picture_essence_coding.u[6] != 0x01
- || p->picture_essence_coding.u[8] != 0x04
- || p->picture_essence_coding.u[9] != 0x01
- || p->picture_essence_coding.u[10] != 0x02
- || p->picture_essence_coding.u[11] != 0x02
- || p->picture_essence_coding.u[12] != 0x01) {
- GST_ERROR ("No MPEG picture essence coding");
- caps = NULL;
- } else if (p->picture_essence_coding.u[13] >= 0x01 &&
- p->picture_essence_coding.u[13] <= 0x08) {
- caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2,
- "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
- } else if (p->picture_essence_coding.u[13] == 0x10) {
- caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1,
- "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
- } else if (p->picture_essence_coding.u[13] == 0x20) {
- MXFLocalTag *local_tag =
- (((MXFMetadataGenericDescriptor *) f)->
- other_tags) ? g_hash_table_lookup (((MXFMetadataGenericDescriptor *)
- f)->other_tags, &sony_mpeg4_extradata) : NULL;
-
- caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4,
- "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
-
- if (local_tag) {
- GstBuffer *codec_data = NULL;
- codec_data = gst_buffer_new_and_alloc (local_tag->size);
- memcpy (GST_BUFFER_DATA (codec_data), local_tag->data, local_tag->size);
- gst_caps_set_simple (caps, "codec_data", GST_TYPE_BUFFER, codec_data,
- NULL);
- gst_buffer_unref (codec_data);
- }
-
- } else {
- GST_ERROR ("Unsupported MPEG picture essence coding 0x%02x",
- p->picture_essence_coding.u[13]);
- caps = NULL;
- }
+ caps =
+ mxf_mpeg_es_create_caps (package, track, tags, handler, mapping_data, f,
+ p, s, d);
} else if (f->essence_container.u[13] == 0x07) {
GST_ERROR ("MPEG PES streams not supported yet");
return NULL;
@@ -354,7 +381,6 @@ mxf_mpeg_video_create_caps (MXFMetadataGenericPackage * package,
} else if (f->essence_container.u[13] == 0x09) {
GST_DEBUG ("Found MPEG TS stream");
caps = gst_caps_new_simple ("video/mpegts", NULL);
-
}
if (p)