From: <sl...@ke...> - 2008-11-21 10:27:33
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Fri Nov 21 2008 10:27:29 UTC Log message: * configure.ac: * gst/mxf/Makefile.am: * gst/mxf/mxf.c: (plugin_init): * gst/mxf/mxfaes-bwf.c: (mxf_metadata_wave_audio_essence_descriptor_parse), (mxf_metadata_wave_audio_essence_descriptor_reset), (mxf_is_aes_bwf_essence_track), (mxf_bwf_handle_essence_element), (mxf_bwf_create_caps), (mxf_aes_bwf_create_caps): * gst/mxf/mxfaes-bwf.h: * gst/mxf/mxfdemux.c: (gst_mxf_pad_finalize), (gst_mxf_pad_class_init), (gst_mxf_pad_init), (gst_mxf_demux_flush), (gst_mxf_demux_remove_pad), (gst_mxf_demux_reset_mxf_state), (gst_mxf_demux_reset_metadata), (gst_mxf_demux_reset), (gst_mxf_demux_pull_range), (gst_mxf_demux_push_src_event), (gst_mxf_demux_handle_partition_pack), (gst_mxf_demux_handle_primer_pack), (gst_mxf_demux_handle_metadata_preface), (gst_mxf_demux_handle_metadata_identification), (gst_mxf_demux_handle_metadata_content_storage), (gst_mxf_demux_handle_metadata_essence_container_data), (gst_mxf_demux_handle_metadata_material_package), (gst_mxf_demux_handle_metadata_source_package), (gst_mxf_demux_handle_metadata_track), (gst_mxf_demux_handle_metadata_sequence), (gst_mxf_demux_handle_metadata_structural_component), (gst_mxf_demux_handle_metadata_generic_descriptor), (gst_mxf_demux_handle_metadata_file_descriptor), (gst_mxf_demux_handle_metadata_multiple_descriptor), (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), (gst_mxf_demux_handle_metadata_locator), (gst_mxf_demux_handle_header_metadata_resolve_references), (gst_mxf_demux_handle_header_metadata_update_streams), (gst_mxf_demux_handle_metadata), (gst_mxf_demux_handle_generic_container_system_item), (gst_mxf_demux_handle_generic_container_essence_element), (gst_mxf_demux_handle_random_index_pack), (gst_mxf_demux_handle_index_table_segment), (gst_mxf_demux_pull_klv_packet), (gst_mxf_demux_parse_footer_metadata), (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_pull_and_handle_klv_packet), (gst_mxf_demux_loop), (gst_mxf_demux_chain), (gst_mxf_demux_src_event), (gst_mxf_demux_src_query_type), (gst_mxf_demux_src_query), (gst_mxf_demux_sink_activate), (gst_mxf_demux_sink_activate_push), (gst_mxf_demux_sink_activate_pull), (gst_mxf_demux_sink_event), (gst_mxf_demux_change_state), (gst_mxf_demux_finalize), (gst_mxf_demux_base_init), (gst_mxf_demux_class_init), (gst_mxf_demux_init): * gst/mxf/mxfdemux.h: * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_parse), (mxf_metadata_mpeg_video_descriptor_reset), (mxf_is_mpeg_video_essence_track), (mxf_mpeg_video_handle_essence_element), (mxf_mpeg_video_create_caps): * gst/mxf/mxfmpeg.h: * gst/mxf/mxfparse.c: (mxf_is_mxf_packet), (mxf_is_partition_pack), (mxf_is_header_partition_pack), (mxf_is_body_partition_pack), (mxf_is_footer_partition_pack), (mxf_is_fill), (mxf_is_primer_pack), (mxf_is_metadata), (mxf_is_random_index_pack), (mxf_is_index_table_segment), (mxf_is_generic_container_system_item), (mxf_is_generic_container_essence_element), (mxf_is_generic_container_essence_container_label), (mxf_ul_is_equal), (mxf_ul_is_zero), (mxf_ul_to_string), (mxf_umid_is_equal), (mxf_umid_is_zero), (mxf_umid_to_string), (gst_mxf_ul_hash), (gst_mxf_ul_equal), (mxf_timestamp_parse), (mxf_timestamp_is_unknown), (mxf_timestamp_compare), (mxf_fraction_parse), (mxf_utf16_to_utf8), (mxf_product_version_parse), (mxf_partition_pack_parse), (mxf_partition_pack_reset), (_mxf_mapping_ul_free), (mxf_primer_pack_parse), (mxf_primer_pack_reset), (mxf_local_tag_parse), (gst_mxf_local_tag_free), (gst_metadata_add_custom_tag), (mxf_metadata_preface_parse), (mxf_metadata_preface_reset), (mxf_metadata_identification_parse), (mxf_metadata_identification_reset), (mxf_metadata_content_storage_parse), (mxf_metadata_content_storage_reset), (mxf_metadata_essence_container_data_parse), (mxf_metadata_essence_container_data_reset), (mxf_metadata_generic_package_parse), (mxf_metadata_generic_package_reset), (mxf_metadata_track_parse), (mxf_metadata_track_reset), (mxf_metadata_track_identifier_parse), (mxf_metadata_sequence_parse), (mxf_metadata_sequence_reset), (mxf_metadata_structural_component_parse), (mxf_metadata_structural_component_reset), (mxf_metadata_generic_descriptor_parse), (mxf_metadata_generic_descriptor_reset), (mxf_metadata_file_descriptor_parse), (mxf_metadata_file_descriptor_reset), (mxf_metadata_generic_sound_essence_descriptor_parse), (mxf_metadata_generic_sound_essence_descriptor_reset), (mxf_metadata_generic_picture_essence_descriptor_parse), (mxf_metadata_generic_picture_essence_descriptor_reset), (mxf_metadata_cdci_picture_essence_descriptor_parse), (mxf_metadata_cdci_picture_essence_descriptor_reset), (mxf_metadata_multiple_descriptor_parse), (mxf_metadata_multiple_descriptor_reset), (mxf_metadata_locator_parse), (mxf_metadata_locator_reset): * gst/mxf/mxfparse.h: * gst/mxf/mxftypes.h: Add first version of an MXF demuxer. Currently it supports MPEG video and raw audio and OP 1a/b/c. Modified files: . : ChangeLog configure.ac Added files: gst/mxf : Makefile.am mxf.c mxfaes-bwf.c mxfaes-bwf.h mxfdemux.c mxfdemux.h mxfmpeg.c mxfmpeg.h mxfparse.c mxfparse.h mxftypes.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3719&r2=1.3720 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/configure.ac.diff?r1=1.909&r2=1.910 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/Makefile.am?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxf.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3719 retrieving revision 1.3720 diff -u -d -r1.3719 -r1.3720 --- ChangeLog 21 Nov 2008 00:47:36 -0000 1.3719 +++ ChangeLog 21 Nov 2008 10:27:12 -0000 1.3720 @@ -1,3 +1,113 @@ +2008-11-21 Sebastian Dröge <seb...@co...> + + * configure.ac: + * gst/mxf/Makefile.am: + * gst/mxf/mxf.c: (plugin_init): + * gst/mxf/mxfaes-bwf.c: + (mxf_metadata_wave_audio_essence_descriptor_parse), + (mxf_metadata_wave_audio_essence_descriptor_reset), + (mxf_is_aes_bwf_essence_track), (mxf_bwf_handle_essence_element), + (mxf_bwf_create_caps), (mxf_aes_bwf_create_caps): + * gst/mxf/mxfaes-bwf.h: + * gst/mxf/mxfdemux.c: (gst_mxf_pad_finalize), + (gst_mxf_pad_class_init), (gst_mxf_pad_init), + (gst_mxf_demux_flush), (gst_mxf_demux_remove_pad), + (gst_mxf_demux_reset_mxf_state), (gst_mxf_demux_reset_metadata), + (gst_mxf_demux_reset), (gst_mxf_demux_pull_range), + (gst_mxf_demux_push_src_event), + (gst_mxf_demux_handle_partition_pack), + (gst_mxf_demux_handle_primer_pack), + (gst_mxf_demux_handle_metadata_preface), + (gst_mxf_demux_handle_metadata_identification), + (gst_mxf_demux_handle_metadata_content_storage), + (gst_mxf_demux_handle_metadata_essence_container_data), + (gst_mxf_demux_handle_metadata_material_package), + (gst_mxf_demux_handle_metadata_source_package), + (gst_mxf_demux_handle_metadata_track), + (gst_mxf_demux_handle_metadata_sequence), + (gst_mxf_demux_handle_metadata_structural_component), + (gst_mxf_demux_handle_metadata_generic_descriptor), + (gst_mxf_demux_handle_metadata_file_descriptor), + (gst_mxf_demux_handle_metadata_multiple_descriptor), + (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), + (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), + (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), + (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), + (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), + (gst_mxf_demux_handle_metadata_locator), + (gst_mxf_demux_handle_header_metadata_resolve_references), + (gst_mxf_demux_handle_header_metadata_update_streams), + (gst_mxf_demux_handle_metadata), + (gst_mxf_demux_handle_generic_container_system_item), + (gst_mxf_demux_handle_generic_container_essence_element), + (gst_mxf_demux_handle_random_index_pack), + (gst_mxf_demux_handle_index_table_segment), + (gst_mxf_demux_pull_klv_packet), + (gst_mxf_demux_parse_footer_metadata), + (gst_mxf_demux_handle_klv_packet), + (gst_mxf_demux_pull_and_handle_klv_packet), (gst_mxf_demux_loop), + (gst_mxf_demux_chain), (gst_mxf_demux_src_event), + (gst_mxf_demux_src_query_type), (gst_mxf_demux_src_query), + (gst_mxf_demux_sink_activate), (gst_mxf_demux_sink_activate_push), + (gst_mxf_demux_sink_activate_pull), (gst_mxf_demux_sink_event), + (gst_mxf_demux_change_state), (gst_mxf_demux_finalize), + (gst_mxf_demux_base_init), (gst_mxf_demux_class_init), + (gst_mxf_demux_init): + * gst/mxf/mxfdemux.h: + * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_parse), + (mxf_metadata_mpeg_video_descriptor_reset), + (mxf_is_mpeg_video_essence_track), + (mxf_mpeg_video_handle_essence_element), + (mxf_mpeg_video_create_caps): + * gst/mxf/mxfmpeg.h: + * gst/mxf/mxfparse.c: (mxf_is_mxf_packet), (mxf_is_partition_pack), + (mxf_is_header_partition_pack), (mxf_is_body_partition_pack), + (mxf_is_footer_partition_pack), (mxf_is_fill), + (mxf_is_primer_pack), (mxf_is_metadata), + (mxf_is_random_index_pack), (mxf_is_index_table_segment), + (mxf_is_generic_container_system_item), + (mxf_is_generic_container_essence_element), + (mxf_is_generic_container_essence_container_label), + (mxf_ul_is_equal), (mxf_ul_is_zero), (mxf_ul_to_string), + (mxf_umid_is_equal), (mxf_umid_is_zero), (mxf_umid_to_string), + (gst_mxf_ul_hash), (gst_mxf_ul_equal), (mxf_timestamp_parse), + (mxf_timestamp_is_unknown), (mxf_timestamp_compare), + (mxf_fraction_parse), (mxf_utf16_to_utf8), + (mxf_product_version_parse), (mxf_partition_pack_parse), + (mxf_partition_pack_reset), (_mxf_mapping_ul_free), + (mxf_primer_pack_parse), (mxf_primer_pack_reset), + (mxf_local_tag_parse), (gst_mxf_local_tag_free), + (gst_metadata_add_custom_tag), (mxf_metadata_preface_parse), + (mxf_metadata_preface_reset), (mxf_metadata_identification_parse), + (mxf_metadata_identification_reset), + (mxf_metadata_content_storage_parse), + (mxf_metadata_content_storage_reset), + (mxf_metadata_essence_container_data_parse), + (mxf_metadata_essence_container_data_reset), + (mxf_metadata_generic_package_parse), + (mxf_metadata_generic_package_reset), (mxf_metadata_track_parse), + (mxf_metadata_track_reset), (mxf_metadata_track_identifier_parse), + (mxf_metadata_sequence_parse), (mxf_metadata_sequence_reset), + (mxf_metadata_structural_component_parse), + (mxf_metadata_structural_component_reset), + (mxf_metadata_generic_descriptor_parse), + (mxf_metadata_generic_descriptor_reset), + (mxf_metadata_file_descriptor_parse), + (mxf_metadata_file_descriptor_reset), + (mxf_metadata_generic_sound_essence_descriptor_parse), + (mxf_metadata_generic_sound_essence_descriptor_reset), + (mxf_metadata_generic_picture_essence_descriptor_parse), + (mxf_metadata_generic_picture_essence_descriptor_reset), + (mxf_metadata_cdci_picture_essence_descriptor_parse), + (mxf_metadata_cdci_picture_essence_descriptor_reset), + (mxf_metadata_multiple_descriptor_parse), + (mxf_metadata_multiple_descriptor_reset), + (mxf_metadata_locator_parse), (mxf_metadata_locator_reset): + * gst/mxf/mxfparse.h: + * gst/mxf/mxftypes.h: + Add first version of an MXF demuxer. Currently it supports + MPEG video and raw audio and OP 1a/b/c. 2008-11-20 Michael Smith <ms...@so...> * sys/dshowdecwrapper/gstdshowaudiodec.cpp: Index: configure.ac RCS file: /cvs/gstreamer/gst-plugins-bad/configure.ac,v retrieving revision 1.909 retrieving revision 1.910 diff -u -d -r1.909 -r1.910 --- configure.ac 14 Nov 2008 16:15:43 -0000 1.909 +++ configure.ac 21 Nov 2008 10:27:13 -0000 1.910 @@ -254,6 +254,7 @@ AG_GST_CHECK_PLUGIN(mpeg4videoparse) AG_GST_CHECK_PLUGIN(mpegvideoparse) AG_GST_CHECK_PLUGIN(mve) +AG_GST_CHECK_PLUGIN(mxf) AG_GST_CHECK_PLUGIN(nsf) AG_GST_CHECK_PLUGIN(nuvdemux) AG_GST_CHECK_PLUGIN(pcapparse) @@ -1410,6 +1411,7 @@ gst/mpeg4videoparse/Makefile gst/mpegvideoparse/Makefile gst/mve/Makefile +gst/mxf/Makefile gst/nsf/Makefile gst/nuvdemux/Makefile gst/pcapparse/Makefile --- NEW FILE: Makefile.am --- plugin_LTLIBRARIES = libgstmxf.la libgstmxf_la_SOURCES = \ mxf.c \ mxfdemux.c \ mxfparse.c \ mxfaes-bwf.c \ mxfmpeg.c libgstmxf_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstmxf_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) libgstmxf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = \ mxfdemux.h \ mxfparse.h \ mxfaes-bwf.h \ mxfmpeg.h \ mxftypes.h --- NEW FILE: mxf.c --- /* GStreamer * Copyright (C) <2008> Sebastian Dröge <seb...@co...> * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include <gst/gst.h> #include "mxfdemux.h" GST_DEBUG_CATEGORY (mxf_debug); #define GST_CAT_DEFAULT mxf_debug static gboolean plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "mxfdemux", GST_RANK_PRIMARY, GST_TYPE_MXF_DEMUX)) return FALSE; GST_DEBUG_CATEGORY_INIT (mxf_debug, "mxf", 0, "MXF"); return TRUE; } GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "mxf", "MXF plugin library", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) --- NEW FILE: mxfaes-bwf.c --- * Copyright (C) 2008 Sebastian Dröge <seb...@co...> /* Implementation of SMPTE 382M - Mapping AES3 and Broadcast Wave * Audio into the MXF Generic Container /* TODO: * - Handle the case were a track only references specific channels * of the essence (ChannelID property) * - Add support for more codecs #include "config.h" #include <string.h> #include "mxfaes-bwf.h" GST_DEBUG_CATEGORY_EXTERN (mxf_debug); /* SMPTE 382M Annex 1 */ gboolean mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL * key, MXFMetadataWaveAudioEssenceDescriptor * descriptor, const MXFPrimerPack * primer, guint16 type, const guint8 * data, gsize size) guint16 tag, tag_size; const guint8 *tag_data; gchar str[48]; g_return_val_if_fail (data != NULL, FALSE); memset (descriptor, 0, sizeof (MXFMetadataWaveAudioEssenceDescriptor)); if (!mxf_metadata_generic_sound_essence_descriptor_parse (key, (MXFMetadataGenericSoundEssenceDescriptor *) descriptor, primer, type, data, size)) goto error; while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) { if (tag_size == 0 || tag == 0x0000) goto next; switch (tag) { case 0x3d0a: GST_WRITE_UINT16_BE (data, 0x0000); if (tag_size != 2) goto error; descriptor->block_align = GST_READ_UINT16_BE (tag_data); break; case 0x3d0b: if (tag_size != 1) descriptor->sequence_offset = GST_READ_UINT8 (tag_data); case 0x3d09: if (tag_size != 4) descriptor->avg_bps = GST_READ_UINT32_BE (tag_data); case 0x3d32: if (tag_size != 16) memcpy (&descriptor->channel_assignment, tag_data, 16); case 0x3d29: descriptor->peak_envelope_version = GST_READ_UINT32_BE (tag_data); case 0x3d2a: descriptor->peak_envelope_format = GST_READ_UINT32_BE (tag_data); case 0x3d2b: descriptor->points_per_peak_value = GST_READ_UINT32_BE (tag_data); case 0x3d2c: descriptor->peak_envelope_block_size = GST_READ_UINT32_BE (tag_data); case 0x3d2d: descriptor->peak_channels = GST_READ_UINT32_BE (tag_data); case 0x3d2e: descriptor->peak_frames = GST_READ_UINT32_BE (tag_data); case 0x3d2f: if (tag_size != 8) descriptor->peak_of_peaks_position = GST_READ_UINT64_BE (tag_data); case 0x3d30: if (!mxf_timestamp_parse (&descriptor->peak_envelope_timestamp, tag_data, tag_size)) case 0x3d31: descriptor->peak_envelope_data = g_memdup (tag_data, tag_size); descriptor->peak_envelope_data_length = tag_size; default: if (type != MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR) goto next; if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size, &((MXFMetadataGenericDescriptor *) descriptor)->other_tags)) } next: data += 4 + tag_size; size -= 4 + tag_size; } GST_DEBUG ("Parsed wave audio essence descriptor:"); GST_DEBUG (" block align = %u", descriptor->block_align); GST_DEBUG (" sequence offset = %u", descriptor->sequence_offset); GST_DEBUG (" average bps = %u", descriptor->avg_bps); GST_DEBUG (" channel assignment = %s", mxf_ul_to_string (&descriptor->channel_assignment, str)); GST_DEBUG (" peak envelope version = %u", descriptor->peak_envelope_version); GST_DEBUG (" peak envelope format = %u", descriptor->peak_envelope_format); GST_DEBUG (" points per peak value = %u", descriptor->points_per_peak_value); GST_DEBUG (" peak envelope block size = %u", descriptor->peak_envelope_block_size); GST_DEBUG (" peak channels = %u", descriptor->peak_channels); GST_DEBUG (" peak frames = %u", descriptor->peak_frames); GST_DEBUG (" peak of peaks position = %" G_GINT64_FORMAT, descriptor->peak_of_peaks_position); GST_DEBUG (" peak envelope timestamp = %d/%u/%u %u:%u:%u.%u", descriptor->peak_envelope_timestamp.year, descriptor->peak_envelope_timestamp.month, descriptor->peak_envelope_timestamp.day, descriptor->peak_envelope_timestamp.hour, descriptor->peak_envelope_timestamp.minute, descriptor->peak_envelope_timestamp.second, (descriptor->peak_envelope_timestamp.quarter_msecond * 1000) / 256); GST_DEBUG (" peak evelope data size = %u", descriptor->peak_envelope_data_length); error: GST_ERROR ("Invalid wave audio essence descriptor"); mxf_metadata_wave_audio_essence_descriptor_reset (descriptor); return FALSE; void mxf_metadata_wave_audio_essence_descriptor_reset (MXFMetadataWaveAudioEssenceDescriptor * descriptor) g_return_if_fail (descriptor != NULL); mxf_metadata_generic_sound_essence_descriptor_reset ( (MXFMetadataGenericSoundEssenceDescriptor *) descriptor); mxf_is_aes_bwf_essence_track (const MXFMetadataTrack * track) guint i; g_return_val_if_fail (track != NULL, FALSE); if (track->descriptor == NULL) { GST_ERROR ("No descriptor for this track"); for (i = 0; i < track->n_descriptor; i++) { MXFMetadataFileDescriptor *d = track->descriptor[i]; MXFUL *key = &d->essence_container; /* SMPTE 382M 9 */ if (mxf_is_generic_container_essence_container_label (key) && key->u[12] == 0x02 && key->u[13] == 0x06 && (key->u[14] == 0x01 || key->u[14] == 0x02 || key->u[14] == 0x03 || key->u[14] == 0x04 || key->u[14] == 0x08 || key->u[14] == 0x09)) return TRUE; static GstFlowReturn mxf_bwf_handle_essence_element (const MXFUL * key, GstBuffer * buffer, GstCaps * caps, MXFMetadataGenericPackage * package, MXFMetadataTrack * track, MXFMetadataStructuralComponent * component, gpointer mapping_data, GstBuffer ** outbuf) *outbuf = buffer; /* SMPTE 382M Table 1: Check if this is some kind of Wave element */ if (key->u[12] != 0x16 || (key->u[14] != 0x01 && key->u[14] != 0x02 && key->u[14] != 0x0b)) { GST_ERROR ("Invalid BWF essence element"); return GST_FLOW_ERROR; /* FIXME: check if the size is a multiply of the unit size, ... */ return GST_FLOW_OK; /* SMPTE RP224 */ static const MXFUL mxf_sound_essence_compression_uncompressed = { {0x06, 0x0E, 0x2B, 0x34, 0x04, 0x01, 0x01, 0x01, 0x04, 0x02, 0x02, 0x01, 0x7F, 0x00, 0x00, 0x00} }; static const MXFUL mxf_sound_essence_compression_aiff = { {0x06, 0x0E, 0x2B, 0x34, 0x04, 0x01, 0x01, 0x07, 0x04, 0x02, 0x02, 0x01, 0x7E, 0x00, 0x00, 0x00} static GstCaps * mxf_bwf_create_caps (MXFMetadataGenericPackage * package, MXFMetadataTrack * track, MXFMetadataGenericSoundEssenceDescriptor * descriptor, GstTagList ** tags, MXFEssenceElementHandler * handler, gpointer * mapping_data) GstCaps *ret = NULL; MXFMetadataWaveAudioEssenceDescriptor *wa_descriptor = NULL; if (((MXFMetadataGenericDescriptor *) descriptor)->type == MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR) wa_descriptor = (MXFMetadataWaveAudioEssenceDescriptor *) descriptor; /* TODO: set caps for avg bitrate, audio codec, ...... */ /* TODO: Handle width=!depth, needs shifting of samples */ /* FIXME: set a channel layout */ if (mxf_ul_is_zero (&descriptor->sound_essence_compression) || mxf_ul_is_equal (&descriptor->sound_essence_compression, &mxf_sound_essence_compression_uncompressed)) { guint block_align; if (descriptor->channel_count == 0 || descriptor->quantization_bits == 0 || descriptor->audio_sampling_rate.n == 0 || descriptor->audio_sampling_rate.d == 0) { GST_ERROR ("Invalid descriptor"); return NULL; if (wa_descriptor) block_align = wa_descriptor->block_align; else block_align = GST_ROUND_UP_8 (descriptor->quantization_bits) / 8; ret = gst_caps_new_simple ("audio/x-raw-int", "rate", G_TYPE_INT, (gint) (((gdouble) descriptor->audio_sampling_rate.n) / ((gdouble) descriptor->audio_sampling_rate.d) + 0.5), "channels", G_TYPE_INT, descriptor->channel_count, "signed", G_TYPE_BOOLEAN, (block_align != 1), "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, "depth", G_TYPE_INT, (block_align / descriptor->channel_count) * 8, "width", G_TYPE_INT, (block_align / descriptor->channel_count) * 8, NULL); } else if (mxf_ul_is_equal (&descriptor->sound_essence_compression, &mxf_sound_essence_compression_aiff)) { (block_align != 1), "endianness", G_TYPE_INT, G_BIG_ENDIAN, "depth", } else { GST_ERROR ("Unsupported sound essence compression: %s", mxf_ul_to_string (&descriptor->sound_essence_compression, str)); *handler = mxf_bwf_handle_essence_element; return ret; GstCaps * mxf_aes_bwf_create_caps (MXFMetadataGenericPackage * package, MXFMetadataTrack * track, GstTagList ** tags, MXFMetadataGenericSoundEssenceDescriptor *s = NULL; g_return_val_if_fail (package != NULL, NULL); g_return_val_if_fail (track != NULL, NULL); GST_ERROR ("No descriptor found for this track"); return NULL; /* TODO: handle AES3 audio */ if ((track->descriptor[i]->parent.type == MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR || track->descriptor[i]->parent.type == MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR) && (track->descriptor[i]->essence_container.u[14] == 0x01 || track->descriptor[i]->essence_container.u[14] == 0x02 || track->descriptor[i]->essence_container.u[14] == 0x08)) { s = (MXFMetadataGenericSoundEssenceDescriptor *) track->descriptor[i]; break; if (!s) { } else if (s) { return mxf_bwf_create_caps (package, track, s, tags, handler, mapping_data); return NULL; --- NEW FILE: mxfaes-bwf.h --- #ifndef __MXF_AES_BWF_H__ #define __MXF_AES_BWF_H__ #include "mxfparse.h" #define MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR 0x0148 typedef struct { MXFMetadataGenericSoundEssenceDescriptor parent; guint16 block_align; guint8 sequence_offset; guint32 avg_bps; MXFUL channel_assignment; guint32 peak_envelope_version; guint32 peak_envelope_format; guint32 points_per_peak_value; guint32 peak_envelope_block_size; guint32 peak_channels; guint32 peak_frames; gint64 peak_of_peaks_position; MXFTimestamp peak_envelope_timestamp; guint8 *peak_envelope_data; guint16 peak_envelope_data_length; } MXFMetadataWaveAudioEssenceDescriptor; gboolean mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL *key, MXFMetadataWaveAudioEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_wave_audio_essence_descriptor_reset (MXFMetadataWaveAudioEssenceDescriptor *descriptor); gboolean mxf_is_aes_bwf_essence_track (const MXFMetadataTrack *track); mxf_aes_bwf_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); #endif /* __MXF_AES_BWF_H__ */ --- NEW FILE: mxfdemux.c --- [...2820 lines suppressed...] gst_pad_set_event_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_mxf_demux_sink_event)); gst_pad_set_chain_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_mxf_demux_chain)); gst_pad_set_activate_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_mxf_demux_sink_activate)); gst_pad_set_activatepull_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_mxf_demux_sink_activate_pull)); gst_pad_set_activatepush_function (demux->sinkpad, GST_DEBUG_FUNCPTR (gst_mxf_demux_sink_activate_push)); gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad); demux->adapter = gst_adapter_new (); demux->src = g_ptr_array_new (); gst_segment_init (&demux->segment, GST_FORMAT_TIME); gst_mxf_demux_reset (demux); --- NEW FILE: mxfdemux.h --- #ifndef __MXF_DEMUX_H__ #define __MXF_DEMUX_H__ #include <gst/base/gstadapter.h> G_BEGIN_DECLS #define GST_TYPE_MXF_DEMUX \ (gst_mxf_demux_get_type()) #define GST_MXF_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MXF_DEMUX,GstMXFDemux)) #define GST_MXF_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MXF_DEMUX,GstMXFDemuxClass)) #define GST_IS_MXF_DEMUX(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MXF_DEMUX)) #define GST_IS_MXF_DEMUX_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MXF_DEMUX)) typedef struct _GstMXFDemux GstMXFDemux; typedef struct _GstMXFDemuxClass GstMXFDemuxClass; struct _GstMXFDemux GstElement element; GstPad *sinkpad; GPtrArray *src; GstAdapter *adapter; GstSegment segment; GstEvent *new_seg_event; GstEvent *close_seg_event; guint64 offset; gboolean random_access; gboolean flushing; guint64 run_in; guint64 header_partition_pack_offset; guint64 footer_partition_pack_offset; /* MXF file state */ MXFPartitionPack partition; MXFPrimerPack primer; /* Structural metadata */ gboolean update_metadata; gboolean final_metadata; MXFMetadataPreface preface; GArray *identification; MXFMetadataContentStorage content_storage; GArray *essence_container_data; GArray *material_package; GArray *source_package; GPtrArray *package; GArray *track; GArray *sequence; GArray *structural_component; GArray *locator; GPtrArray *descriptor; GArray *generic_descriptor; GArray *file_descriptor; GArray *generic_sound_essence_descriptor; GArray *generic_picture_essence_descriptor; GArray *cdci_picture_essence_descriptor; GArray *mpeg_video_descriptor; GArray *wave_audio_essence_descriptor; GArray *multiple_descriptor; MXFUMID current_package_uid; MXFMetadataGenericPackage *current_package; struct _GstMXFDemuxClass GstElementClass parent_class; GType gst_mxf_demux_get_type (void); G_END_DECLS #endif /* __MXF_DEMUX_H__ */ --- NEW FILE: mxfmpeg.c --- /* Implementation of SMPTE 381M - Mapping MPEG streams into the MXF * Generic Container * - Handle PES streams #include "mxfmpeg.h" /* SMPTE 381M 8.1 - ULs of local tags */ static const guint8 _single_sequence_ul[] = { 0x06, 0x0e, 0x2b, 0x34, 0x01, 0x01, 0x01, 0x05, 0x04, 0x01, 0x06, 0x02, 0x01, 0x02, 0x00, 0x00 static const guint8 _constant_b_frames_ul[] = { 0x03, 0x00, 0x00 static const guint8 _coded_content_type_ul[] = { 0x04, 0x00, 0x00 static const guint8 _low_delay_ul[] = { 0x05, 0x00, 0x00 static const guint8 _closed_gop_ul[] = { 0x06, 0x00, 0x00 static const guint8 _identical_gop_ul[] = { 0x07, 0x00, 0x00 static const guint8 _max_gop_ul[] = { 0x08, 0x00, 0x00 static const guint8 _b_picture_count_ul[] = { 0x09, 0x00, 0x00 static const guint8 _bitrate_ul[] = { 0x0b, 0x00, 0x00 static const guint8 _profile_and_level_ul[] = { 0x0a, 0x00, 0x00 mxf_metadata_mpeg_video_descriptor_parse (const MXFUL * key, MXFMetadataMPEGVideoDescriptor * descriptor, memset (descriptor, 0, sizeof (MXFMetadataMPEGVideoDescriptor)); if (!mxf_metadata_cdci_picture_essence_descriptor_parse (key, (MXFMetadataCDCIPictureEssenceDescriptor *) descriptor, primer, type, MXFUL *tag_ul = NULL; if (!(tag_ul = (MXFUL *) g_hash_table_lookup (primer->mappings, GUINT_TO_POINTER (((guint) tag))))) if (memcmp (tag_ul, &_single_sequence_ul, 16) == 0) { GST_WRITE_UINT16_BE (data, 0x0000); if (tag_size != 1) goto error; descriptor->single_sequence = GST_READ_UINT8 (tag_data); } else if (memcmp (tag_ul, &_constant_b_frames_ul, 16) == 0) { descriptor->const_b_frames = GST_READ_UINT8 (tag_data); } else if (memcmp (tag_ul, &_coded_content_type_ul, 16) == 0) { descriptor->coded_content_type = GST_READ_UINT8 (tag_data); } else if (memcmp (tag_ul, &_low_delay_ul, 16) == 0) { descriptor->low_delay = GST_READ_UINT8 (tag_data); } else if (memcmp (tag_ul, &_closed_gop_ul, 16) == 0) { descriptor->closed_gop = GST_READ_UINT8 (tag_data); } else if (memcmp (tag_ul, &_identical_gop_ul, 16) == 0) { descriptor->identical_gop = GST_READ_UINT8 (tag_data); } else if (memcmp (tag_ul, &_max_gop_ul, 16) == 0) { if (tag_size != 2) descriptor->max_gop = GST_READ_UINT16_BE (tag_data); } else if (memcmp (tag_ul, &_b_picture_count_ul, 16) == 0) { descriptor->b_picture_count = GST_READ_UINT16_BE (tag_data); } else if (memcmp (tag_ul, &_bitrate_ul, 16) == 0) { if (tag_size != 4) descriptor->bitrate = GST_READ_UINT32_BE (tag_data); } else if (memcmp (tag_ul, &_profile_and_level_ul, 16) == 0) { descriptor->profile_and_level = GST_READ_UINT8 (tag_data); } else { if (type != MXF_METADATA_MPEG_VIDEO_DESCRIPTOR) goto next; if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size, &((MXFMetadataGenericDescriptor *) descriptor)->other_tags)) GST_DEBUG ("Parsed mpeg video descriptors:"); GST_DEBUG (" single sequence = %s", (descriptor->single_sequence) ? "yes" : "no"); GST_DEBUG (" constant b frames = %s", GST_DEBUG (" coded content type = %u", descriptor->coded_content_type); GST_DEBUG (" low delay = %s", (descriptor->low_delay) ? "yes" : "no"); GST_DEBUG (" closed gop = %s", (descriptor->closed_gop) ? "yes" : "no"); GST_DEBUG (" identical gop = %s", (descriptor->identical_gop) ? "yes" : "no"); GST_DEBUG (" max gop = %u", descriptor->max_gop); GST_DEBUG (" b picture count = %u", descriptor->b_picture_count); GST_DEBUG (" bitrate = %u", descriptor->bitrate); GST_DEBUG (" profile & level = %u", descriptor->profile_and_level); GST_ERROR ("Invalid mpeg video descriptor"); mxf_metadata_mpeg_video_descriptor_reset (descriptor); void mxf_metadata_mpeg_video_descriptor_reset (MXFMetadataMPEGVideoDescriptor * descriptor) mxf_metadata_cdci_picture_essence_descriptor_reset ( (MXFMetadataCDCIPictureEssenceDescriptor *) descriptor); mxf_is_mpeg_video_essence_track (const MXFMetadataTrack * track) if (track->descriptor == NULL) /* SMPTE 381M 7 */ (key->u[13] == 0x04 || key->u[13] == 0x07 || key->u[13] == 0x08 || key->u[13] == 0x09)) mxf_mpeg_video_handle_essence_element (const MXFUL * key, GstBuffer * buffer, /* SMPTE 381M 6.1 */ if (key->u[12] != 0x15 || (key->u[14] != 0x05 && key->u[14] != 0x06 && key->u[14] != 0x07)) { GST_ERROR ("Invalid MPEG video essence element"); mxf_mpeg_video_create_caps (MXFMetadataGenericPackage * package, MXFMetadataMPEGVideoDescriptor *d = NULL; MXFMetadataFileDescriptor *f = NULL; if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == MXF_METADATA_MPEG_VIDEO_DESCRIPTOR) { d = (MXFMetadataMPEGVideoDescriptor *) track->descriptor[i]; f = track->descriptor[i]; } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR || ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR MXF_METADATA_FILE_DESCRIPTOR) { if (!f) { *handler = mxf_mpeg_video_handle_essence_element; /* SMPTE 381M 7 */ if (f->essence_container.u[13] == 0x04) { /* FIXME: get mpeg version somehow */ GST_DEBUG ("Found MPEG ES stream"); return gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); } else if (f->essence_container.u[13] == 0x07) { GST_ERROR ("MPEG PES streams not supported yet"); } else if (f->essence_container.u[13] == 0x08) { GST_DEBUG ("Found MPEG PS stream"); "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); } else if (f->essence_container.u[13] == 0x09) { GST_DEBUG ("Found MPEG TS stream"); return gst_caps_new_simple ("video/mpegts", NULL); --- NEW FILE: mxfmpeg.h --- #ifndef __MXF_MPEG_H__ #define __MXF_MPEG_H__ /* SMPTE 381M 8.1.1 */ #define MXF_METADATA_MPEG_VIDEO_DESCRIPTOR 0x0151 /* SMPTE 381M 8.1 */ MXFMetadataCDCIPictureEssenceDescriptor parent; gboolean single_sequence; gboolean const_b_frames; guint8 coded_content_type; gboolean low_delay; gboolean closed_gop; gboolean identical_gop; guint16 max_gop; guint16 b_picture_count; guint32 bitrate; guint8 profile_and_level; } MXFMetadataMPEGVideoDescriptor; gboolean mxf_metadata_mpeg_video_descriptor_parse (const MXFUL *key, MXFMetadataMPEGVideoDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_mpeg_video_descriptor_reset (MXFMetadataMPEGVideoDescriptor *descriptor); gboolean mxf_is_mpeg_video_essence_track (const MXFMetadataTrack *track); mxf_mpeg_video_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); #endif /* __MXF_MPEG_H__ */ --- NEW FILE: mxfparse.c --- [...2653 lines suppressed...] GST_ERROR ("Invalid locator"); mxf_metadata_locator_reset (locator); void mxf_metadata_locator_reset (MXFMetadataLocator * locator) g_return_if_fail (locator != NULL); if (locator->location) g_free (locator->location); if (locator->other_tags) g_hash_table_destroy (locator->other_tags); memset (locator, 0, sizeof (MXFMetadataLocator)); --- NEW FILE: mxfparse.h --- #ifndef __MXF_PARSE_H__ #define __MXF_PARSE_H__ #include "mxftypes.h" typedef GstFlowReturn (*MXFEssenceElementHandler) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataGenericPackage *package, MXFMetadataTrack *track, MXFMetadataStructuralComponent *component, gpointer mapping_data, GstBuffer **outbuf); gchar * mxf_ul_to_string (const MXFUL *ul, gchar str[48]); gboolean mxf_ul_is_equal (const MXFUL *a, const MXFUL *b); gboolean mxf_ul_is_zero (const MXFUL *ul); gchar *mxf_umid_to_string (const MXFUMID * umid, gchar str[96]); gboolean mxf_umid_is_equal (const MXFUMID *a, const MXFUMID *b); gboolean mxf_umid_is_zero (const MXFUMID *umid); gboolean mxf_is_mxf_packet (const MXFUL *key); gboolean mxf_is_partition_pack (const MXFUL *key); gboolean mxf_is_header_partition_pack (const MXFUL *key); gboolean mxf_is_body_partition_pack (const MXFUL *key); gboolean mxf_is_footer_partition_pack (const MXFUL *key); gboolean mxf_is_primer_pack (const MXFUL *key); gboolean mxf_is_metadata (const MXFUL *key); gboolean mxf_is_random_index_pack (const MXFUL *key); gboolean mxf_is_index_table_segment (const MXFUL *key); gboolean mxf_is_generic_container_system_item (const MXFUL *key); gboolean mxf_is_generic_container_essence_element (const MXFUL *key); gboolean mxf_is_generic_container_essence_container_label (const MXFUL *key); gboolean mxf_is_fill (const MXFUL *key); gchar * mxf_utf16_to_utf8 (const guint8 * data, guint16 size); gboolean mxf_product_version_parse (MXFProductVersion * product_version, const guint8 * data, gsize size); gboolean mxf_fraction_parse (MXFFraction *fraction, const guint8 *data, guint16 size); gboolean mxf_timestamp_parse (MXFTimestamp * timestamp, const guint8 * data, gsize size); gboolean mxf_timestamp_is_unknown (const MXFTimestamp *a); gint mxf_timestamp_compare (const MXFTimestamp *a, const MXFTimestamp *b); gboolean mxf_partition_pack_parse (const MXFUL *key, MXFPartitionPack *pack, const guint8 *data, gsize size); void mxf_partition_pack_reset (MXFPartitionPack *pack); gboolean mxf_primer_pack_parse (const MXFUL *key, MXFPrimerPack *pack, const guint8 *data, gsize size); void mxf_primer_pack_reset (MXFPrimerPack *pack); gboolean mxf_local_tag_parse (const guint8 * data, gsize size, guint16 * tag, guint16 * tag_size, const guint8 ** tag_data); void gst_mxf_local_tag_free (MXFLocalTag *tag); gboolean gst_metadata_add_custom_tag (const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size, GHashTable **hash_table); gboolean mxf_metadata_preface_parse (const MXFUL *key, MXFMetadataPreface *preface, const MXFPrimerPack *primer, const guint8 *data, gsize size); void mxf_metadata_preface_reset (MXFMetadataPreface *preface); gboolean mxf_metadata_identification_parse (const MXFUL *key, MXFMetadataIdentification *identification, const MXFPrimerPack *primer, const guint8 *data, gsize size); void mxf_metadata_identification_reset (MXFMetadataIdentification *identification); gboolean mxf_metadata_content_storage_parse (const MXFUL *key, MXFMetadataContentStorage *content_storage, const MXFPrimerPack *primer, const guint8 *data, gsize size); void mxf_metadata_content_storage_reset (MXFMetadataContentStorage *content_storage); gboolean mxf_metadata_essence_container_data_parse (const MXFUL *key, MXFMetadataEssenceContainerData *essence_container_data, const MXFPrimerPack *primer, const guint8 *data, gsize size); void mxf_metadata_essence_container_data_reset (MXFMetadataEssenceContainerData *essence_container_data); gboolean mxf_metadata_generic_package_parse (const MXFUL *key, MXFMetadataGenericPackage *generic_package, const MXFPrimerPack *primer, const guint8 *data, gsize size); void mxf_metadata_generic_package_reset (MXFMetadataGenericPackage *generic_package); gboolean mxf_metadata_track_parse (const MXFUL *key, MXFMetadataTrack *track, const MXFPrimerPack *primer, const guint8 *data, gsize size); void mxf_metadata_track_reset (MXFMetadataTrack *track); MXFMetadataTrackType mxf_metadata_track_identifier_parse (const MXFUL *track_identifier); gboolean mxf_metadata_sequence_parse (const MXFUL *key, MXFMetadataSequence *sequence, const MXFPrimerPack *primer, const guint8 *data, gsize size); void mxf_metadata_sequence_reset (MXFMetadataSequence *sequence); gboolean mxf_metadata_structural_component_parse (const MXFUL *key, MXFMetadataStructuralComponent *component, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_structural_component_reset (MXFMetadataStructuralComponent *component); gboolean mxf_metadata_generic_descriptor_parse (const MXFUL *key, MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_generic_descriptor_reset (MXFMetadataGenericDescriptor *descriptor); gboolean mxf_metadata_file_descriptor_parse (const MXFUL *key, MXFMetadataFileDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_file_descriptor_reset (MXFMetadataFileDescriptor *descriptor); gboolean mxf_metadata_generic_sound_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericSoundEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_generic_sound_essence_descriptor_reset (MXFMetadataGenericSoundEssenceDescriptor *descriptor); gboolean mxf_metadata_generic_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_generic_picture_essence_descriptor_reset (MXFMetadataGenericPictureEssenceDescriptor *descriptor); gboolean mxf_metadata_cdci_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataCDCIPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_cdci_picture_essence_descriptor_reset (MXFMetadataCDCIPictureEssenceDescriptor *descriptor); gboolean mxf_metadata_multiple_descriptor_parse (const MXFUL *key, MXFMetadataMultipleDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_multiple_descriptor_reset (MXFMetadataMultipleDescriptor *descriptor); gboolean mxf_metadata_locator_parse (const MXFUL *key, MXFMetadataLocator *locator, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); void mxf_metadata_locator_reset (MXFMetadataLocator *locator); #endif /* __MXF_PARSE_H__ */ --- NEW FILE: mxftypes.h --- #ifndef __MXF_TYPES_H__ #define __MXF_TYPES_H__ /* SMPTE 377M 3.2 */ guint8 u[16]; } MXFUL; guint8 u[32]; } MXFUMID; /* SMPTE 377M 3.3 */ gint16 year; guint8 month; guint8 day; guint8 hour; guint8 minute; guint8 second; guint8 quarter_msecond; } MXFTimestamp; guint16 major; guint16 minor; guint16 patch; guint16 build; guint16 release; } MXFProductVersion; gint32 n; gint32 d; } MXFFraction; /* SMPTE 377M 8.3 */ MXFUL key; guint16 size; guint8 *data; } MXFLocalTag; typedef enum { MXF_PARTITION_PACK_HEADER, MXF_PARTITION_PACK_BODY, MXF_PARTITION_PACK_FOOTER } MXFPartitionPackType; /* SMPTE 377M 6.1, Table 1 and 2 */ gboolean valid; MXFPartitionPackType type; gboolean closed; gboolean complete; guint16 major_version; guint16 minor_version; guint32 kag_size; guint64 this_partition; guint64 prev_partition; guint64 footer_partition; guint64 header_byte_count; guint64 index_byte_count; guint32 index_sid; guint64 body_offset; guint32 body_sid; MXFUL operational_pattern; guint32 n_essence_containers; MXFUL *essence_containers; } MXFPartitionPack; /* SMPTE 377M 8.1 */ GHashTable *mappings; } MXFPrimerPack; /* SMPTE 377M 8.6 table 14 */ #define MXF_METADATA_PREFACE (0x012f) #define MXF_METADATA_IDENTIFICATION (0x0130) #define MXF_METADATA_CONTENT_STORAGE (0x0118) #define MXF_METADATA_ESSENCE_CONTAINER_DATA (0x0123) #define MXF_METADATA_MATERIAL_PACKAGE (0x0136) #define MXF_METADATA_SOURCE_PACKAGE (0x0137) #define MXF_METADATA_TRACK (0x013b) #define MXF_METADATA_EVENT_TRACK (0x0139) #define MXF_METADATA_STATIC_TRACK (0x013a) #define MXF_METADATA_SEQUENCE (0x010f) #define MXF_METADATA_SOURCE_CLIP (0x0111) #define MXF_METADATA_TIMECODE_COMPONENT (0x0114) #define MXF_METADATA_DM_SEGMENT (0x0141) #define MXF_METADATA_DM_SOURCE_CLIP (0x0145) #define MXF_METADATA_FILE_DESCRIPTOR (0x0125) #define MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR (0x0127) #define MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR (0x0128) #define MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR (0x0129) #define MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR (0x0142) #define MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR (0x0143) #define MXF_METADATA_MULTIPLE_DESCRIPTOR (0x0144) #define MXF_METADATA_NETWORK_LOCATOR (0x0132) #define MXF_METADATA_TEXT_LOCATOR (0x0133) /* SMPTE 377M Annex A, B, C, D */ typedef struct _MXFMetadataPreface MXFMetadataPreface; typedef struct _MXFMetadataIdentification MXFMetadataIdentification; typedef struct _MXFMetadataContentStorage MXFMetadataContentStorage; typedef struct _MXFMetadataEssenceContainerData MXFMetadataEssenceContainerData; typedef struct _MXFMetadataGenericPackage MXFMetadataGenericPackage; typedef MXFMetadataGenericPackage MXFMetadataMaterialPackage; typedef MXFMetadataGenericPackage MXFMetadataSourcePackage; typedef struct _MXFMetadataTrack MXFMetadataTrack; typedef struct _MXFMetadataSequence MXFMetadataSequence; typedef struct _MXFMetadataStructuralComponent MXFMetadataStructuralComponent; typedef struct _MXFMetadataGenericDescriptor MXFMetadataGenericDescriptor; typedef struct _MXFMetadataFileDescriptor MXFMetadataFileDescriptor; typedef struct _MXFMetadataGenericPictureEssenceDescriptor MXFMetadataGenericPictureEssenceDescriptor; typedef struct _MXFMetadataCDCIPictureEssenceDescriptor MXFMetadataCDCIPictureEssenceDescriptor; typedef struct _MXFMetadataGenericSoundEssenceDescriptor MXFMetadataGenericSoundEssenceDescriptor; typedef struct _MXFMetadataMultipleDescriptor MXFMetadataMultipleDescriptor; typedef struct _MXFMetadataLocator MXFMetadataLocator; struct _MXFMetadataPreface { MXFUL instance_uid; MXFUL generation_uid; MXFTimestamp last_modified_date; guint16 version; guint32 object_model_version; MXFUL primary_package_uid; MXFMetadataGenericPackage *primary_package; guint32 n_identifications; MXFUL *identifications_uids; MXFMetadataIdentification **identifications; MXFUL content_storage_uid; MXFMetadataContentStorage *content_storage; guint32 n_dm_schemes; MXFUL *dm_schemes; GHashTable *other_tags; struct _MXFMetadataIdentification { gchar *company_name; gchar *product_name; MXFProductVersion product_version; gchar *version_string; MXFUL product_uid; MXFTimestamp modification_date; MXFProductVersion toolkit_version; gchar *platform; struct _MXFMetadataContentStorage { guint32 n_packages; MXFUL *packages_uids; MXFMetadataGenericPackage **packages; guint32 n_essence_container_data; MXFUL *essence_container_data_uids; MXFMetadataEssenceContainerData **essence_container_data; struct _MXFMetadataEssenceContainerData { MXFUMID linked_package_uid; MXFMetadataGenericPackage *linked_package; MXF_METADATA_GENERIC_PACKAGE_SOURCE = 0, MXF_METADATA_GENERIC_PACKAGE_MATERIAL = 1, MXF_METADATA_GENERIC_PACKAGE_TOP_LEVEL_SOURCE = 2 } MXFMetadataGenericPackageType; struct _MXFMetadataGenericPackage { MXFUMID package_uid; MXFMetadataGenericPackageType type; gchar *name; MXFTimestamp package_creation_date; MXFTimestamp package_modified_date; guint32 n_tracks; MXFUL *tracks_uids; MXFMetadataTrack **tracks; guint n_timecode_tracks; guint n_metadata_tracks; guint n_essence_tracks; guint n_other_tracks; /* Only in Source packages */ MXFUL descriptors_uid; guint32 n_descriptors; MXFMetadataGenericDescriptor **descriptors; MXF_METADATA_TRACK_UNKNOWN = 0x00, MXF_METADATA_TRACK_TIMECODE_12M_INACTIVE = 0x10, MXF_METADATA_TRACK_TIMECODE_12M_ACTIVE = 0x11, MXF_METADATA_TRACK_TIMECODE_309M = 0x12, MXF_METADATA_TRACK_METADATA = 0x20, MXF_METADATA_TRACK_PICTURE_ESSENCE = 0x30, MXF_METADATA_TRACK_SOUND_ESSENCE = 0x31, MXF_METADATA_TRACK_DATA_ESSENCE = 0x32, MXF_METADATA_TRACK_AUXILIARY_DATA = 0x40, MXF_METADATA_TRACK_PARSED_TEXT = 0x41 } MXFMetadataTrackType; struct _MXFMetadataTrack { guint32 track_id; guint32 track_number; gchar *track_name; MXFFraction edit_rate; gint64 origin; MXFUL sequence_uid; MXFMetadataSequence *sequence; MXFMetadataFileDescriptor **descriptor; guint n_descriptor; struct _MXFMetadataSequence { MXFUL data_definition; gint64 duration; guint32 n_structural_components; MXFUL *structural_components_uids; MXFMetadataStructuralComponent **structural_components; struct _MXFMetadataStructuralComponent { guint16 type; union { struct { gint64 start_timecode; guint16 rounded_timecode_base; gboolean drop_frame; } timecode_component; gint64 start_position; MXFUMID source_package_id; MXFMetadataGenericPackage *source_package; guint32 source_track_id; } source_clip; }; struct _MXFMetadataGenericDescriptor { guint32 n_locators; MXFUL *locators_uids; MXFMetadataLocator **locators; gboolean is_file_descriptor; struct _MXFMetadataFileDescriptor { MXFMetadataGenericDescriptor parent; guint32 linked_track_id; MXFFraction sample_rate; gint64 container_duration; MXFUL essence_container; MXFUL codec; struct _MXFMetadataGenericPictureEssenceDescriptor { MXFMetadataFileDescriptor parent; guint8 signal_standard; guint8 frame_layout; guint32 stored_width; guint32 stored_height; gint32 stored_f2_offset; guint32 sampled_width; guint32 sampled_height; gint32 sampled_x_offset; gint32 sampled_y_offset; guint32 display_height; guint32 display_width; gint32 display_x_offset; gint32 display_y_offset; gint32 display_f2_offset; MXFFraction aspect_ratio; guint8 active_format_descriptor; gint32 video_line_map[2]; guint8 alpha_transparency; MXFUL capture_gamma; guint32 image_alignment_offset; guint32 image_start_offset; guint32 image_end_offset; guint8 field_dominance; MXFUL picture_essence_coding; struct _MXFMetadataCDCIPictureEssenceDescriptor { MXFMetadataGenericPictureEssenceDescriptor parent; guint32 component_depth; guint32 horizontal_subsampling; guint32 vertical_subsampling; guint8 color_siting; gboolean reversed_byte_order; gint16 padding_bits; guint32 alpha_sample_depth; guint32 black_ref_level; guint32 white_ref_level; guint32 color_range; struct _MXFMetadataGenericSoundEssenceDescriptor { MXFFraction audio_sampling_rate; gboolean locked; gint8 audio_ref_level; guint8 electro_spatial_formulation; guint32 channel_count; guint32 quantization_bits; gint8 dial_norm; MXFUL sound_essence_compression; struct _MXFMetadataMultipleDescriptor { MXFUL *sub_descriptors_uids; guint32 n_sub_descriptors; MXFMetadataGenericDescriptor **sub_descriptors; struct _MXFMetadataLocator { gchar *location; #endif /* __MXF_TYPES_H__ */ |
From: <sl...@ke...> - 2008-11-22 14:42:28
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sat Nov 22 2008 14:42:22 UTC Log message: * gst/mxf/mxfaes-bwf.c: (mxf_metadata_wave_audio_essence_descriptor_parse): * gst/mxf/mxfaes-bwf.h: * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_range), (gst_mxf_demux_pull_klv_packet), (gst_mxf_demux_parse_footer_metadata), (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_pull_and_handle_klv_packet), (gst_mxf_demux_chain): * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_parse): * gst/mxf/mxfmpeg.h: * gst/mxf/mxfparse.c: (mxf_timestamp_parse), (mxf_fraction_parse), (mxf_utf16_to_utf8), (mxf_product_version_parse), (mxf_partition_pack_parse), (mxf_primer_pack_parse), (mxf_local_tag_parse), (mxf_metadata_preface_parse), (mxf_metadata_identification_parse), (mxf_metadata_content_storage_parse), (mxf_metadata_essence_container_data_parse), (mxf_metadata_generic_package_parse), (mxf_metadata_track_parse), (mxf_metadata_sequence_parse), (mxf_metadata_structural_component_parse), (mxf_metadata_generic_descriptor_parse), (mxf_metadata_file_descriptor_parse), (mxf_metadata_generic_sound_essence_descriptor_parse), (mxf_metadata_generic_picture_essence_descriptor_parse), (mxf_metadata_cdci_picture_essence_descriptor_parse), (mxf_metadata_multiple_descriptor_parse), (mxf_metadata_locator_parse): * gst/mxf/mxfparse.h: Use guint instead of guint64 or gsize for all buffer sizes and use correct format strings for them. Only local tag set sizes are still guint16 as they can't be larger. Only allow KLV packets of sizes below 1<<32 as GStreamer only uses guint for buffer sizes. The MXF standard allows packet sizes up to 1<<64. Modified files: . : ChangeLog gst/mxf : mxfaes-bwf.c mxfaes-bwf.h mxfdemux.c mxfmpeg.c mxfmpeg.h mxfparse.c mxfparse.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3725&r2=1.3726 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3725 retrieving revision 1.3726 diff -u -d -r1.3725 -r1.3726 --- ChangeLog 22 Nov 2008 13:17:23 -0000 1.3725 +++ ChangeLog 22 Nov 2008 14:42:04 -0000 1.3726 @@ -1,3 +1,41 @@ +2008-11-22 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfaes-bwf.c: + (mxf_metadata_wave_audio_essence_descriptor_parse): + * gst/mxf/mxfaes-bwf.h: + * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_range), + (gst_mxf_demux_pull_klv_packet), + (gst_mxf_demux_parse_footer_metadata), + (gst_mxf_demux_handle_klv_packet), + (gst_mxf_demux_pull_and_handle_klv_packet), (gst_mxf_demux_chain): + * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_parse): + * gst/mxf/mxfmpeg.h: + * gst/mxf/mxfparse.c: (mxf_timestamp_parse), (mxf_fraction_parse), + (mxf_utf16_to_utf8), (mxf_product_version_parse), + (mxf_partition_pack_parse), (mxf_primer_pack_parse), + (mxf_local_tag_parse), (mxf_metadata_preface_parse), + (mxf_metadata_identification_parse), + (mxf_metadata_content_storage_parse), + (mxf_metadata_essence_container_data_parse), + (mxf_metadata_generic_package_parse), (mxf_metadata_track_parse), + (mxf_metadata_sequence_parse), + (mxf_metadata_structural_component_parse), + (mxf_metadata_generic_descriptor_parse), + (mxf_metadata_file_descriptor_parse), + (mxf_metadata_generic_sound_essence_descriptor_parse), + (mxf_metadata_generic_picture_essence_descriptor_parse), + (mxf_metadata_cdci_picture_essence_descriptor_parse), + (mxf_metadata_multiple_descriptor_parse), + (mxf_metadata_locator_parse): + * gst/mxf/mxfparse.h: + Use guint instead of guint64 or gsize for all buffer sizes and + use correct format strings for them. Only local tag set sizes + are still guint16 as they can't be larger. + Only allow KLV packets of sizes below 1<<32 as GStreamer only uses + guint for buffer sizes. The MXF standard allows packet sizes up + to 1<<64. 2008-11-22 Wim Taymans <wim...@co...> * gst/rtpmanager/gstrtpbin.c: (gst_rtp_bin_release_pad): Index: mxfaes-bwf.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mxfaes-bwf.c 21 Nov 2008 10:27:14 -0000 1.1 +++ mxfaes-bwf.c 22 Nov 2008 14:42:07 -0000 1.2 @@ -43,7 +43,7 @@ gboolean mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL * key, MXFMetadataWaveAudioEssenceDescriptor * descriptor, - const MXFPrimerPack * primer, guint16 type, const guint8 * data, gsize size) + const MXFPrimerPack * primer, guint16 type, const guint8 * data, guint size) { guint16 tag, tag_size; const guint8 *tag_data; @@ -256,6 +256,7 @@ { {0x06, 0x0E, 0x2B, 0x34, 0x04, 0x01, 0x01, 0x01, 0x04, 0x02, 0x02, 0x01, 0x7F, 0x00, 0x00, 0x00} }; static const MXFUL mxf_sound_essence_compression_aiff = { {0x06, 0x0E, 0x2B, 0x34, 0x04, 0x01, 0x01, 0x07, 0x04, 0x02, 0x02, 0x01, 0x7E, 0x00, 0x00, 0x00} Index: mxfaes-bwf.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h,v --- mxfaes-bwf.h 21 Nov 2008 10:27:14 -0000 1.1 +++ mxfaes-bwf.h 22 Nov 2008 14:42:07 -0000 1.2 @@ -55,7 +55,7 @@ guint16 peak_envelope_data_length; } MXFMetadataWaveAudioEssenceDescriptor; -gboolean mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL *key, MXFMetadataWaveAudioEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL *key, MXFMetadataWaveAudioEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_wave_audio_essence_descriptor_reset (MXFMetadataWaveAudioEssenceDescriptor *descriptor); gboolean mxf_is_aes_bwf_essence_track (const MXFMetadataTrack *track); Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v --- mxfdemux.c 21 Nov 2008 10:27:14 -0000 1.1 +++ mxfdemux.c 22 Nov 2008 14:42:07 -0000 1.2 @@ -376,7 +376,7 @@ ret = gst_pad_pull_range (demux->sinkpad, offset, size, buffer); if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_WARNING_OBJECT (demux, - "failed when pulling %d bytes from offset %" G_GUINT64_FORMAT ": %s", + "failed when pulling %u bytes from offset %" G_GUINT64_FORMAT ": %s", size, offset, gst_flow_get_name (ret)); *buffer = NULL; return ret; @@ -384,7 +384,7 @@ if (G_UNLIKELY (*buffer && GST_BUFFER_SIZE (*buffer) != size)) { - "partial pull got %d when expecting %d from offset %" G_GUINT64_FORMAT, + "partial pull got %u when expecting %u from offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (*buffer), size, offset); gst_buffer_unref (*buffer); ret = GST_FLOW_UNEXPECTED; @@ -1127,9 +1127,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1414,8 +1413,8 @@ continue; type = - mxf_metadata_track_identifier_parse (&component-> - data_definition); + mxf_metadata_track_identifier_parse + (&component->data_definition); break; } } else { @@ -1977,12 +1976,12 @@ static GstFlowReturn gst_mxf_demux_pull_klv_packet (GstMXFDemux * demux, guint64 offset, MXFUL * key, - GstBuffer ** outbuf, guint64 * read) + GstBuffer ** outbuf, guint * read) GstBuffer *buffer = NULL; const guint8 *data; guint64 data_offset = 0; - guint64 length; + guint length; gchar key_str[48]; GstFlowReturn ret = GST_FLOW_OK; @@ -2015,10 +2014,14 @@ gst_buffer_unref (buffer); - /* Must be at most 8 according to SMPTE-379M 5.3.4 */ + /* Must be at most 8 according to SMPTE-379M 5.3.4 and + * GStreamer buffers can only have a 4 bytes length */ if (slen > 8) { - GST_ERROR_OBJECT (demux, "Invalid KLV packet length: %" G_GUINT64_FORMAT, - slen); + GST_ERROR_OBJECT (demux, "Invalid KLV packet length: %u", slen); + ret = GST_FLOW_ERROR; + goto beach; + } else if (slen > 4) { + GST_ERROR_OBJECT (demux, "Unsupported KLV packet length: %u", slen); ret = GST_FLOW_ERROR; goto beach; } @@ -2064,7 +2067,7 @@ guint64 offset, old_offset = demux->offset; MXFUL key; - guint64 read = 0; + guint read = 0; memcpy (&partition, &demux->partition, sizeof (MXFPartitionPack)); @@ -2253,11 +2256,11 @@ ret = gst_mxf_demux_handle_index_table_segment (demux, key, buffer); } else if (mxf_is_fill (key)) { GST_DEBUG_OBJECT (demux, - "Skipping filler packet of size %" G_GUINT64_FORMAT " at offset %" + "Skipping filler packet of size %u at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset); } else { - "Skipping unknown packet of size %" G_GUINT64_FORMAT " at offset %" + "Skipping unknown packet of size %u at offset %" G_GUINT64_FORMAT ", key: %s", GST_BUFFER_SIZE (buffer), demux->offset, mxf_ul_to_string (key, key_str)); } @@ -2272,7 +2275,7 @@ ret = gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buffer, @@ -2402,14 +2405,14 @@ GstMXFDemux *demux = NULL; const guint8 *data = NULL; - guint64 length = 0; + guint length = 0; guint64 offset = 0; demux = GST_MXF_DEMUX (gst_pad_get_parent (pad)); - GST_LOG_OBJECT (demux, "received buffer of %d bytes at offset %" + GST_LOG_OBJECT (demux, "received buffer of %u bytes at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (inbuf), GST_BUFFER_OFFSET (inbuf)); if (G_UNLIKELY (GST_BUFFER_OFFSET (inbuf) == 0)) { @@ -2497,10 +2500,14 @@ offset = 16 + 1 + slen; - /* Must be at most 8 according to SMPTE-379M 5.3.4 */ + /* Must be at most 8 according to SMPTE-379M 5.3.4 and + * GStreamer buffers can only have a 4 bytes length */ if (slen > 8) { - GST_ERROR_OBJECT (demux, - "Invalid KLV packet length: %" G_GUINT64_FORMAT, slen); + GST_ERROR_OBJECT (demux, "Invalid KLV packet length: %u", slen); + ret = GST_FLOW_ERROR; + break; + } else if (slen > 4) { + GST_ERROR_OBJECT (demux, "Unsupported KLV packet length: %u", slen); ret = GST_FLOW_ERROR; break; } Index: mxfmpeg.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v --- mxfmpeg.c 21 Nov 2008 10:27:14 -0000 1.1 +++ mxfmpeg.c 22 Nov 2008 14:42:07 -0000 1.2 @@ -91,7 +91,7 @@ mxf_metadata_mpeg_video_descriptor_parse (const MXFUL * key, MXFMetadataMPEGVideoDescriptor * descriptor, Index: mxfmpeg.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h,v --- mxfmpeg.h 21 Nov 2008 10:27:14 -0000 1.1 +++ mxfmpeg.h 22 Nov 2008 14:42:07 -0000 1.2 @@ -49,7 +49,7 @@ guint8 profile_and_level; } MXFMetadataMPEGVideoDescriptor; -gboolean mxf_metadata_mpeg_video_descriptor_parse (const MXFUL *key, MXFMetadataMPEGVideoDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_mpeg_video_descriptor_parse (const MXFUL *key, MXFMetadataMPEGVideoDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_mpeg_video_descriptor_reset (MXFMetadataMPEGVideoDescriptor *descriptor); gboolean mxf_is_mpeg_video_essence_track (const MXFMetadataTrack *track); Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v --- mxfparse.c 21 Nov 2008 10:27:14 -0000 1.1 +++ mxfparse.c 22 Nov 2008 14:42:07 -0000 1.2 @@ -281,7 +281,7 @@ } -mxf_timestamp_parse (MXFTimestamp * timestamp, const guint8 * data, gsize size) +mxf_timestamp_parse (MXFTimestamp * timestamp, const guint8 * data, guint size) g_return_val_if_fail (data != NULL, FALSE); g_return_val_if_fail (timestamp != NULL, FALSE); @@ -332,7 +332,7 @@ -mxf_fraction_parse (MXFFraction * fraction, const guint8 * data, guint16 size) +mxf_fraction_parse (MXFFraction * fraction, const guint8 * data, guint size) g_return_val_if_fail (fraction != NULL, FALSE); @@ -349,7 +349,7 @@ gchar * -mxf_utf16_to_utf8 (const guint8 * data, guint16 size) +mxf_utf16_to_utf8 (const guint8 * data, guint size) gchar *ret; GError *error = NULL; @@ -369,7 +369,7 @@ mxf_product_version_parse (MXFProductVersion * product_version, - const guint8 * data, gsize size) + const guint8 * data, guint size) g_return_val_if_fail (product_version != NULL, FALSE); @@ -391,7 +391,7 @@ /* SMPTE 377M 6.1, Table 2 */ mxf_partition_pack_parse (const MXFUL * key, MXFPartitionPack * pack, gint i; gchar str[48]; @@ -536,7 +536,7 @@ mxf_primer_pack_parse (const MXFUL * key, MXFPrimerPack * pack, guint32 n; @@ -604,7 +604,7 @@ /* structural metadata parsing */ -mxf_local_tag_parse (const guint8 * data, gsize size, guint16 * tag, +mxf_local_tag_parse (const guint8 * data, guint size, guint16 * tag, guint16 * tag_size, const guint8 ** tag_data) @@ -677,7 +677,7 @@ mxf_metadata_preface_parse (const MXFUL * key, MXFMetadataPreface * preface, const MXFPrimerPack * primer, @@ -884,7 +884,7 @@ mxf_metadata_identification_parse (const MXFUL * key, MXFMetadataIdentification * identification, - const MXFPrimerPack * primer, const guint8 * data, gsize size) + const MXFPrimerPack * primer, const guint8 * data, guint size) @@ -1031,7 +1031,7 @@ mxf_metadata_content_storage_parse (const MXFUL * key, MXFMetadataContentStorage * content_storage, @@ -1159,7 +1159,7 @@ mxf_metadata_essence_container_data_parse (const MXFUL * key, MXFMetadataEssenceContainerData * essence_container_data, @@ -1250,7 +1250,7 @@ mxf_metadata_generic_package_parse (const MXFUL * key, MXFMetadataGenericPackage * generic_package, @@ -1401,7 +1401,7 @@ mxf_metadata_track_parse (const MXFUL * key, MXFMetadataTrack * track, const MXFPrimerPack * primer, @@ -1556,7 +1556,7 @@ mxf_metadata_sequence_parse (const MXFUL * key, MXFMetadataSequence * sequence, const MXFPrimerPack * primer, @@ -1672,7 +1672,7 @@ mxf_metadata_structural_component_parse (const MXFUL * key, MXFMetadataStructuralComponent * component, @@ -1832,7 +1832,7 @@ mxf_metadata_generic_descriptor_parse (const MXFUL * key, MXFMetadataGenericDescriptor * descriptor, @@ -1936,7 +1936,7 @@ mxf_metadata_file_descriptor_parse (const MXFUL * key, MXFMetadataFileDescriptor * descriptor, @@ -2035,7 +2035,7 @@ mxf_metadata_generic_sound_essence_descriptor_parse (const MXFUL * key, MXFMetadataGenericSoundEssenceDescriptor * descriptor, @@ -2152,7 +2152,7 @@ mxf_metadata_generic_picture_essence_descriptor_parse (const MXFUL * key, MXFMetadataGenericPictureEssenceDescriptor * descriptor, @@ -2392,7 +2392,7 @@ mxf_metadata_cdci_picture_essence_descriptor_parse (const MXFUL * key, MXFMetadataCDCIPictureEssenceDescriptor * descriptor, @@ -2523,7 +2523,7 @@ mxf_metadata_multiple_descriptor_parse (const MXFUL * key, MXFMetadataMultipleDescriptor * descriptor, @@ -2611,7 +2611,7 @@ mxf_metadata_locator_parse (const MXFUL * key, MXFMetadataLocator * locator, const MXFPrimerPack * primer, - guint16 type, const guint8 * data, gsize size) + guint16 type, const guint8 * data, guint size) Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v --- mxfparse.h 21 Nov 2008 10:27:15 -0000 1.1 +++ mxfparse.h 22 Nov 2008 14:42:08 -0000 1.2 @@ -53,24 +53,24 @@ gboolean mxf_is_fill (const MXFUL *key); -gchar * mxf_utf16_to_utf8 (const guint8 * data, guint16 size); +gchar * mxf_utf16_to_utf8 (const guint8 * data, guint size); gboolean mxf_product_version_parse (MXFProductVersion * product_version, - const guint8 * data, gsize size); + const guint8 * data, guint size); -gboolean mxf_fraction_parse (MXFFraction *fraction, const guint8 *data, guint16 size); +gboolean mxf_fraction_parse (MXFFraction *fraction, const guint8 *data, guint size); -gboolean mxf_timestamp_parse (MXFTimestamp * timestamp, const guint8 * data, gsize size); +gboolean mxf_timestamp_parse (MXFTimestamp * timestamp, const guint8 * data, guint size); gboolean mxf_timestamp_is_unknown (const MXFTimestamp *a); gint mxf_timestamp_compare (const MXFTimestamp *a, const MXFTimestamp *b); -gboolean mxf_partition_pack_parse (const MXFUL *key, MXFPartitionPack *pack, const guint8 *data, gsize size); +gboolean mxf_partition_pack_parse (const MXFUL *key, MXFPartitionPack *pack, const guint8 *data, guint size); void mxf_partition_pack_reset (MXFPartitionPack *pack); -gboolean mxf_primer_pack_parse (const MXFUL *key, MXFPrimerPack *pack, const guint8 *data, gsize size); +gboolean mxf_primer_pack_parse (const MXFUL *key, MXFPrimerPack *pack, const guint8 *data, guint size); void mxf_primer_pack_reset (MXFPrimerPack *pack); -gboolean mxf_local_tag_parse (const guint8 * data, gsize size, guint16 * tag, +gboolean mxf_local_tag_parse (const guint8 * data, guint size, guint16 * tag, guint16 * tag_size, const guint8 ** tag_data); void gst_mxf_local_tag_free (MXFLocalTag *tag); @@ -78,51 +78,51 @@ guint16 tag, const guint8 *tag_data, guint16 tag_size, GHashTable **hash_table); -gboolean mxf_metadata_preface_parse (const MXFUL *key, MXFMetadataPreface *preface, const MXFPrimerPack *primer, const guint8 *data, gsize size); +gboolean mxf_metadata_preface_parse (const MXFUL *key, MXFMetadataPreface *preface, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_preface_reset (MXFMetadataPreface *preface); -gboolean mxf_metadata_identification_parse (const MXFUL *key, MXFMetadataIdentification *identification, const MXFPrimerPack *primer, const guint8 *data, gsize size); +gboolean mxf_metadata_identification_parse (const MXFUL *key, MXFMetadataIdentification *identification, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_identification_reset (MXFMetadataIdentification *identification); -gboolean mxf_metadata_content_storage_parse (const MXFUL *key, MXFMetadataContentStorage *content_storage, const MXFPrimerPack *primer, const guint8 *data, gsize size); +gboolean mxf_metadata_content_storage_parse (const MXFUL *key, MXFMetadataContentStorage *content_storage, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_content_storage_reset (MXFMetadataContentStorage *content_storage); -gboolean mxf_metadata_essence_container_data_parse (const MXFUL *key, MXFMetadataEssenceContainerData *essence_container_data, const MXFPrimerPack *primer, const guint8 *data, gsize size); +gboolean mxf_metadata_essence_container_data_parse (const MXFUL *key, MXFMetadataEssenceContainerData *essence_container_data, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_essence_container_data_reset (MXFMetadataEssenceContainerData *essence_container_data); -gboolean mxf_metadata_generic_package_parse (const MXFUL *key, MXFMetadataGenericPackage *generic_package, const MXFPrimerPack *primer, const guint8 *data, gsize size); +gboolean mxf_metadata_generic_package_parse (const MXFUL *key, MXFMetadataGenericPackage *generic_package, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_generic_package_reset (MXFMetadataGenericPackage *generic_package); -gboolean mxf_metadata_track_parse (const MXFUL *key, MXFMetadataTrack *track, const MXFPrimerPack *primer, const guint8 *data, gsize size); +gboolean mxf_metadata_track_parse (const MXFUL *key, MXFMetadataTrack *track, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_track_reset (MXFMetadataTrack *track); MXFMetadataTrackType mxf_metadata_track_identifier_parse (const MXFUL *track_identifier); -gboolean mxf_metadata_sequence_parse (const MXFUL *key, MXFMetadataSequence *sequence, const MXFPrimerPack *primer, const guint8 *data, gsize size); +gboolean mxf_metadata_sequence_parse (const MXFUL *key, MXFMetadataSequence *sequence, const MXFPrimerPack *primer, const guint8 *data, guint size); void mxf_metadata_sequence_reset (MXFMetadataSequence *sequence); -gboolean mxf_metadata_structural_component_parse (const MXFUL *key, MXFMetadataStructuralComponent *component, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_structural_component_parse (const MXFUL *key, MXFMetadataStructuralComponent *component, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_structural_component_reset (MXFMetadataStructuralComponent *component); -gboolean mxf_metadata_generic_descriptor_parse (const MXFUL *key, MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_generic_descriptor_parse (const MXFUL *key, MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_generic_descriptor_reset (MXFMetadataGenericDescriptor *descriptor); -gboolean mxf_metadata_file_descriptor_parse (const MXFUL *key, MXFMetadataFileDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_file_descriptor_parse (const MXFUL *key, MXFMetadataFileDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_file_descriptor_reset (MXFMetadataFileDescriptor *descriptor); -gboolean mxf_metadata_generic_sound_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericSoundEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_generic_sound_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericSoundEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_generic_sound_essence_descriptor_reset (MXFMetadataGenericSoundEssenceDescriptor *descriptor); -gboolean mxf_metadata_generic_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_generic_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_generic_picture_essence_descriptor_reset (MXFMetadataGenericPictureEssenceDescriptor *descriptor); -gboolean mxf_metadata_cdci_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataCDCIPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_cdci_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataCDCIPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_cdci_picture_essence_descriptor_reset (MXFMetadataCDCIPictureEssenceDescriptor *descriptor); -gboolean mxf_metadata_multiple_descriptor_parse (const MXFUL *key, MXFMetadataMultipleDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_multiple_descriptor_parse (const MXFUL *key, MXFMetadataMultipleDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_multiple_descriptor_reset (MXFMetadataMultipleDescriptor *descriptor); -gboolean mxf_metadata_locator_parse (const MXFUL *key, MXFMetadataLocator *locator, const MXFPrimerPack *primer, guint16 type, const guint8 *data, gsize size); +gboolean mxf_metadata_locator_parse (const MXFUL *key, MXFMetadataLocator *locator, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_locator_reset (MXFMetadataLocator *locator); #endif /* __MXF_PARSE_H__ */ |
From: <sl...@ke...> - 2008-11-22 14:51:27
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sat Nov 22 2008 14:51:20 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_push_src_event), (gst_mxf_demux_handle_header_metadata_update_streams): * gst/mxf/mxfparse.c: (gst_mxf_ul_hash), (mxf_partition_pack_parse), (mxf_primer_pack_parse), (mxf_metadata_preface_parse), (mxf_metadata_content_storage_parse), (mxf_metadata_generic_package_parse), (mxf_metadata_sequence_parse), (mxf_metadata_generic_descriptor_parse), (mxf_metadata_multiple_descriptor_parse): Some more format string fixes and usage of guint instead of gint where negative values don't make sense. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3726&r2=1.3727 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: mxfdemux.c =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mxfdemux.c 22 Nov 2008 14:42:07 -0000 1.2 +++ mxfdemux.c 22 Nov 2008 14:51:06 -0000 1.3 @@ -43,19 +43,19 @@ ); static GstStaticPadTemplate audio_src_template = -GST_STATIC_PAD_TEMPLATE ("audio_%d", +GST_STATIC_PAD_TEMPLATE ("audio_%u", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate video_src_template = -GST_STATIC_PAD_TEMPLATE ("video_%d", +GST_STATIC_PAD_TEMPLATE ("video_%u", static GstStaticPadTemplate data_src_template = -GST_STATIC_PAD_TEMPLATE ("data_%d", +GST_STATIC_PAD_TEMPLATE ("data_%u", @@ -399,7 +399,7 @@ gst_mxf_demux_push_src_event (GstMXFDemux * demux, GstEvent * event) { gboolean ret = TRUE; - gint i; + guint i; GST_DEBUG_OBJECT (demux, "Pushing '%s' event downstream", GST_EVENT_TYPE_NAME (event)); @@ -1127,8 +1127,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1519,7 +1520,7 @@ GstMXFPad *pad = NULL; GstCaps *caps = NULL; - GST_DEBUG_OBJECT (demux, "Handling track %d", i); + GST_DEBUG_OBJECT (demux, "Handling track %u", i); if (!track) { GST_WARNING_OBJECT (demux, "Unresolved track"); @@ -1607,20 +1608,20 @@ case MXF_METADATA_TRACK_PICTURE_ESSENCE: templ = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (demux), - "video_%d"); - pad_name = g_strdup_printf ("video_%d", source_track->track_id); + "video_%u"); + pad_name = g_strdup_printf ("video_%u", source_track->track_id); case MXF_METADATA_TRACK_SOUND_ESSENCE: - "audio_%d"); - pad_name = g_strdup_printf ("audio_%d", source_track->track_id); + "audio_%u"); + pad_name = g_strdup_printf ("audio_%u", source_track->track_id); case MXF_METADATA_TRACK_DATA_ESSENCE: - "data_%d"); - pad_name = g_strdup_printf ("data_%d", source_track->track_id); + "data_%u"); + pad_name = g_strdup_printf ("data_%u", source_track->track_id); default: g_assert_not_reached (); Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v --- mxfparse.c 22 Nov 2008 14:42:07 -0000 1.2 +++ mxfparse.c 22 Nov 2008 14:51:06 -0000 1.3 @@ -264,7 +264,7 @@ gst_mxf_ul_hash (const MXFUL * key) guint32 ret = 0; for (i = 0; i < 4; i++) ret ^= @@ -393,7 +393,7 @@ mxf_partition_pack_parse (const MXFUL * key, MXFPartitionPack * pack, const guint8 * data, guint size) gchar str[48]; g_return_val_if_fail (data != NULL, FALSE); @@ -503,7 +503,7 @@ pack->n_essence_containers); for (i = 0; i < pack->n_essence_containers; i++) { - GST_DEBUG (" essence container %d = %s", i, + GST_DEBUG (" essence container %u = %s", i, mxf_ul_to_string (&pack->essence_containers[i], str)); } @@ -538,7 +538,7 @@ mxf_primer_pack_parse (const MXFUL * key, MXFPrimerPack * pack, guint32 n; @@ -682,7 +682,7 @@ guint16 tag, tag_size; const guint8 *tag_data; @@ -845,15 +845,15 @@ GST_DEBUG (" number of DM schemes = %u", preface->n_dm_schemes); for (i = 0; i < preface->n_identifications; i++) - GST_DEBUG (" identification %d = %s", i, + GST_DEBUG (" identification %u = %s", i, mxf_ul_to_string (&preface->identifications_uids[i], str)); for (i = 0; i < preface->n_essence_containers; i++) mxf_ul_to_string (&preface->essence_containers[i], str)); for (i = 0; i < preface->n_dm_schemes; i++) - GST_DEBUG (" DM schemes %d = %s", i, + GST_DEBUG (" DM schemes %u = %s", i, mxf_ul_to_string (&preface->dm_schemes[i], str)); return TRUE; @@ -1036,7 +1036,7 @@ @@ -1124,10 +1124,10 @@ content_storage->n_essence_container_data); for (i = 0; i < content_storage->n_packages; i++) - GST_DEBUG (" package %i = %s", i, + GST_DEBUG (" package %u = %s", i, mxf_ul_to_string (&content_storage->packages_uids[i], str)); - GST_DEBUG (" essence container data %i = %s", i, + GST_DEBUG (" essence container data %u = %s", i, mxf_ul_to_string (&content_storage->essence_container_data_uids[i], str)); @@ -1255,7 +1255,7 @@ gchar str[96]; @@ -1368,7 +1368,7 @@ GST_DEBUG (" number of tracks = %u", generic_package->n_tracks); for (i = 0; i < generic_package->n_tracks; i++) - GST_DEBUG (" track %d = %s", i, + GST_DEBUG (" track %u = %s", i, mxf_ul_to_string (&generic_package->tracks_uids[i], str)); @@ -1561,7 +1561,7 @@ @@ -1642,7 +1642,7 @@ sequence->n_structural_components); for (i = 0; i < sequence->n_structural_components; i++) - GST_DEBUG (" structural component %d = %s", i, + GST_DEBUG (" structural component %u = %s", i, mxf_ul_to_string (&sequence->structural_components_uids[i], str)); @@ -1837,7 +1837,7 @@ @@ -1899,7 +1899,7 @@ GST_DEBUG (" number of locators = %u", descriptor->n_locators); for (i = 0; i < descriptor->n_locators; i++) - GST_DEBUG (" locator %d = %s", i, + GST_DEBUG (" locator %u = %s", i, mxf_ul_to_string (&descriptor->locators_uids[i], str)); @@ -2528,7 +2528,7 @@ @@ -2583,7 +2583,7 @@ GST_DEBUG ("Parsed multiple descriptor:"); GST_DEBUG (" number of sub descriptors = %u", descriptor->n_sub_descriptors); for (i = 0; i < descriptor->n_sub_descriptors; i++) - GST_DEBUG (" sub descriptor %d = %s", i, + GST_DEBUG (" sub descriptor %u = %s", i, mxf_ul_to_string (&descriptor->sub_descriptors_uids[i], str)); Index: ChangeLog RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3726 retrieving revision 1.3727 diff -u -d -r1.3726 -r1.3727 --- ChangeLog 22 Nov 2008 14:42:04 -0000 1.3726 +++ ChangeLog 22 Nov 2008 14:51:04 -0000 1.3727 @@ -1,5 +1,19 @@ 2008-11-22 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_push_src_event), + (gst_mxf_demux_handle_header_metadata_update_streams): + * gst/mxf/mxfparse.c: (gst_mxf_ul_hash), + (mxf_partition_pack_parse), (mxf_primer_pack_parse), + (mxf_metadata_preface_parse), (mxf_metadata_content_storage_parse), + (mxf_metadata_generic_package_parse), + (mxf_metadata_sequence_parse), + (mxf_metadata_generic_descriptor_parse), + (mxf_metadata_multiple_descriptor_parse): + Some more format string fixes and usage of guint instead of gint + where negative values don't make sense. + +2008-11-22 Sebastian Dröge <seb...@co...> * gst/mxf/mxfaes-bwf.c: (mxf_metadata_wave_audio_essence_descriptor_parse): * gst/mxf/mxfaes-bwf.h: |
From: <sl...@ke...> - 2008-11-23 11:25:49
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sun Nov 23 2008 11:25:45 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_klv_packet), (gst_mxf_demux_chain): Actually we support a length stored inside 8 bytes but it must be smaller than G_MAXUINT for GstBuffer. Modified files: . : ChangeLog gst/mxf : mxfdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3731&r2=1.3732 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3731 retrieving revision 1.3732 diff -u -d -r1.3731 -r1.3732 --- ChangeLog 23 Nov 2008 11:16:35 -0000 1.3731 +++ ChangeLog 23 Nov 2008 11:25:29 -0000 1.3732 @@ -1,5 +1,12 @@ 2008-11-23 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_klv_packet), + (gst_mxf_demux_chain): + Actually we support a length stored inside 8 bytes but it must + be smaller than G_MAXUINT for GstBuffer. + +2008-11-23 Sebastian Dröge <seb...@co...> Patch by: Tal Shalif <tshalif at nargila dot org> * ext/resindvd/resindvdsrc.c: Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mxfdemux.c 22 Nov 2008 14:51:06 -0000 1.3 +++ mxfdemux.c 23 Nov 2008 11:25:30 -0000 1.4 @@ -1127,9 +1127,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1982,7 +1981,7 @@ GstBuffer *buffer = NULL; const guint8 *data; guint64 data_offset = 0; - guint length; + guint64 length; gchar key_str[48]; GstFlowReturn ret = GST_FLOW_OK; @@ -2014,17 +2013,13 @@ data_offset = 16 + 1 + slen; gst_buffer_unref (buffer); + buffer = NULL; - /* Must be at most 8 according to SMPTE-379M 5.3.4 and - * GStreamer buffers can only have a 4 bytes length */ + /* Must be at most 8 according to SMPTE-379M 5.3.4 */ if (slen > 8) { GST_ERROR_OBJECT (demux, "Invalid KLV packet length: %u", slen); ret = GST_FLOW_ERROR; goto beach; - } else if (slen > 4) { - GST_ERROR_OBJECT (demux, "Unsupported KLV packet length: %u", slen); - ret = GST_FLOW_ERROR; - goto beach; } /* Now pull the length of the packet */ @@ -2042,6 +2037,16 @@ } gst_buffer_unref (buffer); + buffer = NULL; + /* GStreamer's buffer sizes are stored in a guint so we + * limit ourself to G_MAXUINT large buffers */ + if (length > G_MAXUINT) { + GST_ERROR_OBJECT (demux, + "Unsupported KLV packet length: %" G_GUINT64_FORMAT, length); + ret = GST_FLOW_ERROR; + goto beach; + } /* Pull the complete KLV packet */ if ((ret = gst_mxf_demux_pull_range (demux, offset + data_offset, length, @@ -2406,7 +2411,7 @@ GstMXFDemux *demux = NULL; MXFUL key; const guint8 *data = NULL; - guint length = 0; + guint64 length = 0; guint64 offset = 0; @@ -2507,10 +2512,6 @@ GST_ERROR_OBJECT (demux, "Invalid KLV packet length: %u", slen); ret = GST_FLOW_ERROR; break; - } else if (slen > 4) { - GST_ERROR_OBJECT (demux, "Unsupported KLV packet length: %u", slen); - ret = GST_FLOW_ERROR; - break; } if (gst_adapter_available (demux->adapter) < 17 + slen) @@ -2527,6 +2528,15 @@ + /* GStreamer's buffer sizes are stored in a guint so we + * limit ourself to G_MAXUINT large buffers */ + if (length > G_MAXUINT) { + GST_ERROR_OBJECT (demux, + "Unsupported KLV packet length: %" G_GUINT64_FORMAT, length); + ret = GST_FLOW_ERROR; + break; + } if (gst_adapter_available (demux->adapter) < offset + length) break; |
From: <sl...@ke...> - 2008-11-24 10:41:31
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Mon Nov 24 2008 10:41:27 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_klv_packet), (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_chain): * gst/mxf/mxfparse.c: (mxf_product_version_parse), (mxf_metadata_identification_parse), (mxf_metadata_content_storage_parse): Allow non-MXF KLV packets and just drop them instead of throwing an error and handle 9 byte product versions as written by Avid. This doesn't add support for the non-standard Avid MXF files but at least makes it possible to parse their header metadata. Fix a copy&paste error in debug output. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3733&r2=1.3734 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3733 retrieving revision 1.3734 diff -u -d -r1.3733 -r1.3734 --- ChangeLog 23 Nov 2008 17:50:06 -0000 1.3733 +++ ChangeLog 24 Nov 2008 10:41:11 -0000 1.3734 @@ -1,3 +1,17 @@ +2008-11-24 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_klv_packet), + (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_chain): + * gst/mxf/mxfparse.c: (mxf_product_version_parse), + (mxf_metadata_identification_parse), + (mxf_metadata_content_storage_parse): + Allow non-MXF KLV packets and just drop them instead of throwing + an error and handle 9 byte product versions as written by Avid. + This doesn't add support for the non-standard Avid MXF files + but at least makes it possible to parse their header metadata. + Fix a copy&paste error in debug output. 2008-11-23 Stefan Kost <en...@us...> * ext/jack/gstjackaudiosink.c: Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mxfdemux.c 23 Nov 2008 11:25:30 -0000 1.4 +++ mxfdemux.c 24 Nov 2008 10:41:12 -0000 1.5 @@ -1127,8 +1127,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1982,7 +1983,6 @@ const guint8 *data; guint64 data_offset = 0; guint64 length; - gchar key_str[48]; GstFlowReturn ret = GST_FLOW_OK; memset (key, 0, sizeof (MXFUL)); @@ -1994,13 +1994,6 @@ data = GST_BUFFER_DATA (buffer); - if (!mxf_is_mxf_packet ((const MXFUL *) data)) { - GST_ERROR_OBJECT (demux, "Not an MXF packet, skipping. Key: %s", - mxf_ul_to_string ((const MXFUL *) data, key_str)); - ret = GST_FLOW_ERROR; - goto beach; - } - memcpy (key, GST_BUFFER_DATA (buffer), 16); /* Decode BER encoded packet length */ @@ -2243,7 +2236,12 @@ goto beach; } - if (mxf_is_partition_pack (key)) { + if (!mxf_is_mxf_packet (key)) { + GST_WARNING_OBJECT (demux, + "Skipping non-MXF packet of size %u at offset %" + G_GUINT64_FORMAT ", key: %s", GST_BUFFER_SIZE (buffer), demux->offset, + mxf_ul_to_string (key, key_str)); + } else if (mxf_is_partition_pack (key)) { ret = gst_mxf_demux_handle_partition_pack (demux, key, buffer); } else if (mxf_is_primer_pack (key)) { ret = gst_mxf_demux_handle_primer_pack (demux, key, buffer); @@ -2414,7 +2412,6 @@ guint64 length = 0; guint64 offset = 0; GstBuffer *buffer = NULL; demux = GST_MXF_DEMUX (gst_pad_get_parent (pad)); @@ -2488,13 +2485,6 @@ /* Pull 16 byte key and first byte of BER encoded length */ data = gst_adapter_peek (demux->adapter, 17); - if (!mxf_is_mxf_packet ((const MXFUL *) data)) { - GST_ERROR_OBJECT (demux, "Not an MXF packet, skipping. Key: %s", - mxf_ul_to_string ((const MXFUL *) data, key_str)); - ret = GST_FLOW_ERROR; - break; - } memcpy (&key, data, 16); /* Decode BER encoded packet length */ Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.3 diff -u -d -r1.3 -r1.4 --- mxfparse.c 22 Nov 2008 14:51:06 -0000 1.3 +++ mxfparse.c 24 Nov 2008 10:41:13 -0000 1.4 @@ -376,14 +376,19 @@ memset (product_version, 0, sizeof (MXFProductVersion)); - if (size < 10) + if (size < 9) return FALSE; product_version->major = GST_READ_UINT16_BE (data); product_version->minor = GST_READ_UINT16_BE (data + 2); product_version->patch = GST_READ_UINT16_BE (data + 4); product_version->build = GST_READ_UINT16_BE (data + 6); - product_version->release = GST_READ_UINT16_BE (data + 8); + /* Avid writes a 9 byte product version */ + if (size == 9) + product_version->release = GST_READ_UINT8 (data + 8); + else + product_version->release = GST_READ_UINT16_BE (data + 8); return TRUE; } @@ -921,8 +926,6 @@ break; case 0x3c03: GST_WRITE_UINT16_BE (data, 0x0000); - if (tag_size != 10) - goto error; if (!mxf_product_version_parse (&identification->product_version, tag_data, tag_size)) goto error; @@ -939,16 +942,12 @@ case 0x3c06: - if (tag_size != 8) if (!mxf_timestamp_parse (&identification->modification_date, tag_data, tag_size)) case 0x3c07: if (!mxf_product_version_parse (&identification->toolkit_version, @@ -1126,7 +1125,7 @@ for (i = 0; i < content_storage->n_packages; i++) GST_DEBUG (" package %u = %s", i, mxf_ul_to_string (&content_storage->packages_uids[i], str)); - for (i = 0; i < content_storage->n_packages; i++) + for (i = 0; i < content_storage->n_essence_container_data; i++) GST_DEBUG (" essence container data %u = %s", i, mxf_ul_to_string (&content_storage->essence_container_data_uids[i], str)); |
From: <sl...@ke...> - 2008-11-24 11:57:02
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Mon Nov 24 2008 11:31:41 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_generic_container_essence_element): Make sure to only output generic container essence elements for a track if the body SID of the surrounding partition is the same as the body SID of the track's source package. Modified files: . : ChangeLog gst/mxf : mxfdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3736&r2=1.3737 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3736 retrieving revision 1.3737 diff -u -d -r1.3736 -r1.3737 --- ChangeLog 24 Nov 2008 11:17:17 -0000 1.3736 +++ ChangeLog 24 Nov 2008 11:31:26 -0000 1.3737 @@ -1,3 +1,11 @@ +2008-11-24 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfdemux.c: + (gst_mxf_demux_handle_generic_container_essence_element): + Make sure to only output generic container essence elements + for a track if the body SID of the surrounding partition is + the same as the body SID of the track's source package. 2008-11-24 Julien Moutte <ju...@fl...> * gst/flv/gstflvdemux.c: (gst_flv_demux_find_offset), Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- mxfdemux.c 24 Nov 2008 10:41:12 -0000 1.5 +++ mxfdemux.c 24 Nov 2008 11:31:27 -0000 1.6 @@ -1127,9 +1127,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1862,7 +1861,7 @@ { GstFlowReturn ret = GST_FLOW_OK; guint32 track_number; - guint i; + guint i, j; GstMXFPad *pad = NULL; GstBuffer *inbuf; GstBuffer *outbuf = NULL; @@ -1890,8 +1889,24 @@ (p->source_track->track_number == 0 && demux->src->len == 1 && demux->current_package->n_essence_tracks == 1)) { - pad = p; - break; + if (demux->essence_container_data) { + for (j = 0; j < demux->essence_container_data->len; j++) { + MXFMetadataEssenceContainerData *edata = + &g_array_index (demux->essence_container_data, + MXFMetadataEssenceContainerData, j); + if (p->source_package == edata->linked_package + && demux->partition.body_sid == edata->body_sid) { + pad = p; + break; + } + } + } else { + pad = p; + } + if (pad) + break; } } |
From: <sl...@ke...> - 2008-11-25 09:38:46
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Tue Nov 25 2008 09:38:41 UTC Log message: * gst/mxf/mxfaes-bwf.c: (mxf_metadata_wave_audio_essence_descriptor_handle_tag): * gst/mxf/mxfaes-bwf.h: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_metadata_generic_descriptor), (gst_mxf_demux_handle_metadata_file_descriptor), (gst_mxf_demux_handle_metadata_multiple_descriptor), (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), (gst_mxf_demux_handle_header_metadata_resolve_references), (gst_mxf_demux_handle_metadata): * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_handle_tag): * gst/mxf/mxfmpeg.h: * gst/mxf/mxfparse.c: (mxf_partition_pack_parse), (mxf_primer_pack_parse), (mxf_metadata_preface_parse), (mxf_metadata_identification_parse), (mxf_metadata_content_storage_parse), (mxf_metadata_essence_container_data_parse), (mxf_metadata_generic_package_parse), (mxf_metadata_track_parse), (mxf_metadata_sequence_parse), (mxf_metadata_structural_component_parse), (mxf_metadata_descriptor_parse), (mxf_metadata_generic_descriptor_handle_tag), (mxf_metadata_generic_descriptor_reset), (mxf_metadata_file_descriptor_handle_tag), (mxf_metadata_generic_sound_essence_descriptor_handle_tag), (mxf_metadata_generic_picture_essence_descriptor_handle_tag), (mxf_metadata_cdci_picture_essence_descriptor_handle_tag), (mxf_metadata_multiple_descriptor_handle_tag), (mxf_metadata_locator_parse): * gst/mxf/mxfparse.h: Rewrite parsing of descriptors to go top-down instead of bottom-up which makes it possible to have the buffer data non-writable. Improve debugging a bit. Modified files: . : ChangeLog gst/mxf : mxfaes-bwf.c mxfaes-bwf.h mxfdemux.c mxfmpeg.c mxfmpeg.h mxfparse.c mxfparse.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3738&r2=1.3739 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3738 retrieving revision 1.3739 diff -u -d -r1.3738 -r1.3739 --- ChangeLog 25 Nov 2008 00:20:20 -0000 1.3738 +++ ChangeLog 25 Nov 2008 09:38:23 -0000 1.3739 @@ -1,3 +1,45 @@ +2008-11-25 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfaes-bwf.c: + (mxf_metadata_wave_audio_essence_descriptor_handle_tag): + * gst/mxf/mxfaes-bwf.h: + * gst/mxf/mxfdemux.c: + (gst_mxf_demux_handle_metadata_generic_descriptor), + (gst_mxf_demux_handle_metadata_file_descriptor), + (gst_mxf_demux_handle_metadata_multiple_descriptor), + (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), + (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), + (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), + (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), + (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), + (gst_mxf_demux_handle_header_metadata_resolve_references), + (gst_mxf_demux_handle_metadata): + * gst/mxf/mxfmpeg.c: + (mxf_metadata_mpeg_video_descriptor_handle_tag): + * gst/mxf/mxfmpeg.h: + * gst/mxf/mxfparse.c: (mxf_partition_pack_parse), + (mxf_primer_pack_parse), (mxf_metadata_preface_parse), + (mxf_metadata_identification_parse), + (mxf_metadata_content_storage_parse), + (mxf_metadata_essence_container_data_parse), + (mxf_metadata_generic_package_parse), (mxf_metadata_track_parse), + (mxf_metadata_sequence_parse), + (mxf_metadata_structural_component_parse), + (mxf_metadata_descriptor_parse), + (mxf_metadata_generic_descriptor_handle_tag), + (mxf_metadata_generic_descriptor_reset), + (mxf_metadata_file_descriptor_handle_tag), + (mxf_metadata_generic_sound_essence_descriptor_handle_tag), + (mxf_metadata_generic_picture_essence_descriptor_handle_tag), + (mxf_metadata_cdci_picture_essence_descriptor_handle_tag), + (mxf_metadata_multiple_descriptor_handle_tag), + (mxf_metadata_locator_parse): + * gst/mxf/mxfparse.h: + Rewrite parsing of descriptors to go top-down instead of bottom-up + which makes it possible to have the buffer data non-writable. + Improve debugging a bit. 2008-11-24 Michael Smith <ms...@so...> * configure.ac: Index: mxfaes-bwf.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mxfaes-bwf.c 22 Nov 2008 14:42:07 -0000 1.2 +++ mxfaes-bwf.c 25 Nov 2008 09:38:26 -0000 1.3 @@ -41,154 +41,134 @@ /* SMPTE 382M Annex 1 */ gboolean -mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL * key, - MXFMetadataWaveAudioEssenceDescriptor * descriptor, - const MXFPrimerPack * primer, guint16 type, const guint8 * data, guint size) + mxf_metadata_wave_audio_essence_descriptor_handle_tag + (MXFMetadataGenericDescriptor * d, const MXFPrimerPack * primer, + guint16 tag, const guint8 * tag_data, guint16 tag_size) { - guint16 tag, tag_size; - const guint8 *tag_data; + MXFMetadataWaveAudioEssenceDescriptor *descriptor = + (MXFMetadataWaveAudioEssenceDescriptor *) d; + gboolean ret = FALSE; gchar str[48]; - g_return_val_if_fail (data != NULL, FALSE); - - memset (descriptor, 0, sizeof (MXFMetadataWaveAudioEssenceDescriptor)); - if (!mxf_metadata_generic_sound_essence_descriptor_parse (key, - (MXFMetadataGenericSoundEssenceDescriptor *) descriptor, primer, type, - data, size)) - goto error; - while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) { - if (tag_size == 0 || tag == 0x0000) - goto next; - switch (tag) { - case 0x3d0a: - GST_WRITE_UINT16_BE (data, 0x0000); - if (tag_size != 2) - goto error; - descriptor->block_align = GST_READ_UINT16_BE (tag_data); - break; - case 0x3d0b: - if (tag_size != 1) - descriptor->sequence_offset = GST_READ_UINT8 (tag_data); - case 0x3d09: - if (tag_size != 4) - descriptor->avg_bps = GST_READ_UINT32_BE (tag_data); - case 0x3d32: - if (tag_size != 16) - memcpy (&descriptor->channel_assignment, tag_data, 16); - case 0x3d29: - descriptor->peak_envelope_version = GST_READ_UINT32_BE (tag_data); - case 0x3d2a: - descriptor->peak_envelope_format = GST_READ_UINT32_BE (tag_data); - case 0x3d2b: - descriptor->points_per_peak_value = GST_READ_UINT32_BE (tag_data); - case 0x3d2c: - descriptor->peak_envelope_block_size = GST_READ_UINT32_BE (tag_data); - case 0x3d2d: - descriptor->peak_channels = GST_READ_UINT32_BE (tag_data); - case 0x3d2e: - descriptor->peak_frames = GST_READ_UINT32_BE (tag_data); - case 0x3d2f: - if (tag_size != 8) - descriptor->peak_of_peaks_position = GST_READ_UINT64_BE (tag_data); - case 0x3d30: - if (!mxf_timestamp_parse (&descriptor->peak_envelope_timestamp, - tag_data, tag_size)) - case 0x3d31: - descriptor->peak_envelope_data = g_memdup (tag_data, tag_size); - descriptor->peak_envelope_data_length = tag_size; - default: - if (type != MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR) - goto next; - if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size, - &((MXFMetadataGenericDescriptor *) descriptor)->other_tags)) - } - next: - data += 4 + tag_size; - size -= 4 + tag_size; + switch (tag) { + case 0x3d0a: + if (tag_size != 2) + goto error; + descriptor->block_align = GST_READ_UINT16_BE (tag_data); + GST_DEBUG (" block align = %u", descriptor->block_align); + ret = TRUE; + break; + case 0x3d0b: + if (tag_size != 1) + descriptor->sequence_offset = GST_READ_UINT8 (tag_data); + GST_DEBUG (" sequence offset = %u", descriptor->sequence_offset); + case 0x3d09: + if (tag_size != 4) + descriptor->avg_bps = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" average bps = %u", descriptor->avg_bps); + case 0x3d32: + if (tag_size != 16) + memcpy (&descriptor->channel_assignment, tag_data, 16); + GST_DEBUG (" channel assignment = %s", + mxf_ul_to_string (&descriptor->channel_assignment, str)); + case 0x3d29: + descriptor->peak_envelope_version = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" peak envelope version = %u", + descriptor->peak_envelope_version); + case 0x3d2a: + descriptor->peak_envelope_format = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" peak envelope format = %u", + descriptor->peak_envelope_format); + case 0x3d2b: + descriptor->points_per_peak_value = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" points per peak value = %u", + descriptor->points_per_peak_value); + case 0x3d2c: + descriptor->peak_envelope_block_size = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" peak envelope block size = %u", + descriptor->peak_envelope_block_size); + case 0x3d2d: + descriptor->peak_channels = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" peak channels = %u", descriptor->peak_channels); + case 0x3d2e: + descriptor->peak_frames = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" peak frames = %u", descriptor->peak_frames); + case 0x3d2f: + if (tag_size != 8) + descriptor->peak_of_peaks_position = GST_READ_UINT64_BE (tag_data); + GST_DEBUG (" peak of peaks position = %" G_GINT64_FORMAT, + descriptor->peak_of_peaks_position); + case 0x3d30: + if (!mxf_timestamp_parse (&descriptor->peak_envelope_timestamp, + tag_data, tag_size)) + GST_DEBUG (" peak envelope timestamp = %d/%u/%u %u:%u:%u.%u", + descriptor->peak_envelope_timestamp.year, + descriptor->peak_envelope_timestamp.month, + descriptor->peak_envelope_timestamp.day, + descriptor->peak_envelope_timestamp.hour, + descriptor->peak_envelope_timestamp.minute, + descriptor->peak_envelope_timestamp.second, + (descriptor->peak_envelope_timestamp.quarter_msecond * 1000) / 256); + case 0x3d31: + descriptor->peak_envelope_data = g_memdup (tag_data, tag_size); + descriptor->peak_envelope_data_length = tag_size; + GST_DEBUG (" peak evelope data size = %u", + descriptor->peak_envelope_data_length); + default: + ret = + mxf_metadata_generic_sound_essence_descriptor_handle_tag (d, primer, + tag, tag_data, tag_size); } - GST_DEBUG ("Parsed wave audio essence descriptor:"); - GST_DEBUG (" block align = %u", descriptor->block_align); - GST_DEBUG (" sequence offset = %u", descriptor->sequence_offset); - GST_DEBUG (" average bps = %u", descriptor->avg_bps); - GST_DEBUG (" channel assignment = %s", - mxf_ul_to_string (&descriptor->channel_assignment, str)); - GST_DEBUG (" peak envelope version = %u", descriptor->peak_envelope_version); - GST_DEBUG (" peak envelope format = %u", descriptor->peak_envelope_format); - GST_DEBUG (" points per peak value = %u", descriptor->points_per_peak_value); - GST_DEBUG (" peak envelope block size = %u", - descriptor->peak_envelope_block_size); - GST_DEBUG (" peak channels = %u", descriptor->peak_channels); - GST_DEBUG (" peak frames = %u", descriptor->peak_frames); - GST_DEBUG (" peak of peaks position = %" G_GINT64_FORMAT, - descriptor->peak_of_peaks_position); - GST_DEBUG (" peak envelope timestamp = %d/%u/%u %u:%u:%u.%u", - descriptor->peak_envelope_timestamp.year, - descriptor->peak_envelope_timestamp.month, - descriptor->peak_envelope_timestamp.day, - descriptor->peak_envelope_timestamp.hour, - descriptor->peak_envelope_timestamp.minute, - descriptor->peak_envelope_timestamp.second, - (descriptor->peak_envelope_timestamp.quarter_msecond * 1000) / 256); - GST_DEBUG (" peak evelope data size = %u", - descriptor->peak_envelope_data_length); - return TRUE; + return ret; error: - GST_ERROR ("Invalid wave audio essence descriptor"); - mxf_metadata_wave_audio_essence_descriptor_reset (descriptor); + GST_ERROR ("Invalid wave audio essence descriptor tag 0x%04x of size %u", tag, + tag_size); - return FALSE; + return TRUE; } void mxf_metadata_wave_audio_essence_descriptor_reset Index: mxfaes-bwf.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.h,v --- mxfaes-bwf.h 22 Nov 2008 14:42:07 -0000 1.2 +++ mxfaes-bwf.h 25 Nov 2008 09:38:26 -0000 1.3 @@ -55,7 +55,8 @@ guint16 peak_envelope_data_length; } MXFMetadataWaveAudioEssenceDescriptor; -gboolean mxf_metadata_wave_audio_essence_descriptor_parse (const MXFUL *key, MXFMetadataWaveAudioEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean mxf_metadata_wave_audio_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, + const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size); void mxf_metadata_wave_audio_essence_descriptor_reset (MXFMetadataWaveAudioEssenceDescriptor *descriptor); gboolean mxf_is_aes_bwf_essence_track (const MXFMetadataTrack *track); Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mxfdemux.c 24 Nov 2008 11:31:27 -0000 1.6 +++ mxfdemux.c 25 Nov 2008 09:38:26 -0000 1.7 @@ -703,21 +703,26 @@ MXFMetadataGenericDescriptor descriptor; + memset (&descriptor, 0, sizeof (descriptor)); GST_DEBUG_OBJECT (demux, "Handling metadata generic descriptor of size %u" " at offset %" G_GUINT64_FORMAT " with type 0x%04d", GST_BUFFER_SIZE (buffer), demux->offset, type); - if (!mxf_metadata_generic_descriptor_parse (key, &descriptor, - &demux->primer, type, GST_BUFFER_DATA (buffer), - GST_BUFFER_SIZE (buffer))) { + if (!mxf_metadata_descriptor_parse (key, + (MXFMetadataGenericDescriptor *) & descriptor, &demux->primer, + type, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), + (MXFMetadataDescriptorHandleTag) + mxf_metadata_generic_descriptor_handle_tag, + (MXFMetadataDescriptorReset) mxf_metadata_generic_descriptor_reset)) { GST_ERROR_OBJECT (demux, "Parsing metadata generic descriptor failed"); return GST_FLOW_ERROR; if (!demux->generic_descriptor) demux->generic_descriptor = - g_array_new (FALSE, FALSE, sizeof (MXFMetadataGenericDescriptor)); + g_array_new (FALSE, TRUE, sizeof (MXFMetadataGenericDescriptor)); g_array_append_val (demux->generic_descriptor, descriptor); @@ -730,21 +735,26 @@ MXFMetadataFileDescriptor descriptor; "Handling metadata file descriptor of size %u" - if (!mxf_metadata_file_descriptor_parse (key, &descriptor, + mxf_metadata_file_descriptor_handle_tag, + (MXFMetadataDescriptorReset) mxf_metadata_file_descriptor_reset)) { GST_ERROR_OBJECT (demux, "Parsing metadata file descriptor failed"); if (!demux->file_descriptor) demux->file_descriptor = - g_array_new (FALSE, FALSE, sizeof (MXFMetadataFileDescriptor)); + g_array_new (FALSE, TRUE, sizeof (MXFMetadataFileDescriptor)); g_array_append_val (demux->file_descriptor, descriptor); @@ -757,21 +767,27 @@ MXFMetadataMultipleDescriptor descriptor; "Handling metadata multiple descriptor of size %u" - if (!mxf_metadata_multiple_descriptor_parse (key, &descriptor, + mxf_metadata_multiple_descriptor_handle_tag, + (MXFMetadataDescriptorReset) mxf_metadata_multiple_descriptor_reset)) + { GST_ERROR_OBJECT (demux, "Parsing metadata multiple descriptor failed"); if (!demux->multiple_descriptor) demux->multiple_descriptor = - g_array_new (FALSE, FALSE, sizeof (MXFMetadataMultipleDescriptor)); + g_array_new (FALSE, TRUE, sizeof (MXFMetadataMultipleDescriptor)); g_array_append_val (demux->multiple_descriptor, descriptor); @@ -784,14 +800,20 @@ MXFMetadataGenericPictureEssenceDescriptor descriptor; "Handling metadata generic picture essence descriptor of size %u" - if (!mxf_metadata_generic_picture_essence_descriptor_parse (key, &descriptor, + mxf_metadata_generic_picture_essence_descriptor_handle_tag, + (MXFMetadataDescriptorReset) + mxf_metadata_generic_picture_essence_descriptor_reset)) { GST_ERROR_OBJECT (demux, "Parsing metadata generic picture essence descriptor failed"); @@ -799,7 +821,7 @@ if (!demux->generic_picture_essence_descriptor) demux->generic_picture_essence_descriptor = - g_array_new (FALSE, FALSE, + g_array_new (FALSE, TRUE, sizeof (MXFMetadataGenericPictureEssenceDescriptor)); g_array_append_val (demux->generic_picture_essence_descriptor, descriptor); @@ -813,14 +835,20 @@ MXFMetadataCDCIPictureEssenceDescriptor descriptor; "Handling metadata CDCI picture essence descriptor of size %u" - if (!mxf_metadata_cdci_picture_essence_descriptor_parse (key, &descriptor, + mxf_metadata_cdci_picture_essence_descriptor_handle_tag, + mxf_metadata_cdci_picture_essence_descriptor_reset)) { "Parsing metadata CDCI picture essence descriptor failed"); @@ -828,7 +856,7 @@ if (!demux->cdci_picture_essence_descriptor) demux->cdci_picture_essence_descriptor = sizeof (MXFMetadataCDCIPictureEssenceDescriptor)); g_array_append_val (demux->cdci_picture_essence_descriptor, descriptor); @@ -842,21 +870,27 @@ MXFMetadataMPEGVideoDescriptor descriptor; "Handling metadata MPEG video descriptor of size %u" - if (!mxf_metadata_mpeg_video_descriptor_parse (key, &descriptor, + mxf_metadata_mpeg_video_descriptor_handle_tag, + mxf_metadata_mpeg_video_descriptor_reset)) { GST_ERROR_OBJECT (demux, "Parsing metadata MPEG video descriptor failed"); if (!demux->mpeg_video_descriptor) demux->mpeg_video_descriptor = - g_array_new (FALSE, FALSE, sizeof (MXFMetadataMPEGVideoDescriptor)); + g_array_new (FALSE, TRUE, sizeof (MXFMetadataMPEGVideoDescriptor)); g_array_append_val (demux->mpeg_video_descriptor, descriptor); @@ -869,14 +903,20 @@ MXFMetadataGenericSoundEssenceDescriptor descriptor; "Handling metadata generic sound essence descriptor of size %u" - if (!mxf_metadata_generic_sound_essence_descriptor_parse (key, &descriptor, + mxf_metadata_generic_sound_essence_descriptor_handle_tag, + mxf_metadata_generic_sound_essence_descriptor_reset)) { "Parsing metadata generic sound essence descriptor failed"); @@ -884,7 +924,7 @@ if (!demux->generic_sound_essence_descriptor) demux->generic_sound_essence_descriptor = sizeof (MXFMetadataGenericSoundEssenceDescriptor)); g_array_append_val (demux->generic_sound_essence_descriptor, descriptor); @@ -898,14 +938,20 @@ MXFMetadataWaveAudioEssenceDescriptor descriptor; "Handling metadata wave sound essence descriptor of size %u" - if (!mxf_metadata_wave_audio_essence_descriptor_parse (key, &descriptor, + mxf_metadata_wave_audio_essence_descriptor_handle_tag, + mxf_metadata_wave_audio_essence_descriptor_reset)) { "Parsing metadata wave sound essence descriptor failed"); @@ -913,7 +959,7 @@ if (!demux->wave_audio_essence_descriptor) demux->wave_audio_essence_descriptor = sizeof (MXFMetadataWaveAudioEssenceDescriptor)); g_array_append_val (demux->wave_audio_essence_descriptor, descriptor); @@ -1748,12 +1794,6 @@ return GST_FLOW_OK; - /* Make writable as the parsing of descriptors sets already read local tags to 0x0000 */ - if (!gst_buffer_is_writable (buffer)) - buffer = gst_buffer_copy (buffer); - else - buffer = gst_buffer_ref (buffer); switch (type) { case MXF_METADATA_PREFACE: ret = gst_mxf_demux_handle_metadata_preface (demux, key, buffer); @@ -1838,8 +1878,6 @@ break; - gst_buffer_unref (buffer); return ret; Index: mxfmpeg.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v --- mxfmpeg.c 22 Nov 2008 14:42:07 -0000 1.2 +++ mxfmpeg.c 25 Nov 2008 09:38:26 -0000 1.3 @@ -89,116 +89,94 @@ }; -mxf_metadata_mpeg_video_descriptor_parse (const MXFUL * key, - MXFMetadataMPEGVideoDescriptor * descriptor, +mxf_metadata_mpeg_video_descriptor_handle_tag (MXFMetadataGenericDescriptor * d, + const MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data, + guint16 tag_size) - memset (descriptor, 0, sizeof (MXFMetadataMPEGVideoDescriptor)); - if (!mxf_metadata_cdci_picture_essence_descriptor_parse (key, - (MXFMetadataCDCIPictureEssenceDescriptor *) descriptor, primer, type, - MXFUL *tag_ul = NULL; + MXFMetadataMPEGVideoDescriptor *descriptor = + (MXFMetadataMPEGVideoDescriptor *) d; + MXFUL *tag_ul = NULL; - if (!(tag_ul = - (MXFUL *) g_hash_table_lookup (primer->mappings, - GUINT_TO_POINTER (((guint) tag))))) + if (!(tag_ul = + (MXFUL *) g_hash_table_lookup (primer->mappings, + GUINT_TO_POINTER (((guint) tag))))) + return FALSE; - if (memcmp (tag_ul, &_single_sequence_ul, 16) == 0) { - GST_WRITE_UINT16_BE (data, 0x0000); - if (tag_size != 1) - goto error; - descriptor->single_sequence = GST_READ_UINT8 (tag_data); - } else if (memcmp (tag_ul, &_constant_b_frames_ul, 16) == 0) { - descriptor->const_b_frames = GST_READ_UINT8 (tag_data); - } else if (memcmp (tag_ul, &_coded_content_type_ul, 16) == 0) { - descriptor->coded_content_type = GST_READ_UINT8 (tag_data); - } else if (memcmp (tag_ul, &_low_delay_ul, 16) == 0) { - descriptor->low_delay = GST_READ_UINT8 (tag_data); - } else if (memcmp (tag_ul, &_closed_gop_ul, 16) == 0) { - descriptor->closed_gop = GST_READ_UINT8 (tag_data); - } else if (memcmp (tag_ul, &_identical_gop_ul, 16) == 0) { - descriptor->identical_gop = GST_READ_UINT8 (tag_data); - } else if (memcmp (tag_ul, &_max_gop_ul, 16) == 0) { - if (tag_size != 2) - descriptor->max_gop = GST_READ_UINT16_BE (tag_data); - } else if (memcmp (tag_ul, &_b_picture_count_ul, 16) == 0) { - descriptor->b_picture_count = GST_READ_UINT16_BE (tag_data); - } else if (memcmp (tag_ul, &_bitrate_ul, 16) == 0) { - if (tag_size != 4) - descriptor->bitrate = GST_READ_UINT32_BE (tag_data); - } else if (memcmp (tag_ul, &_profile_and_level_ul, 16) == 0) { - descriptor->profile_and_level = GST_READ_UINT8 (tag_data); - } else { - if (type != MXF_METADATA_MPEG_VIDEO_DESCRIPTOR) - goto next; - if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size, - &((MXFMetadataGenericDescriptor *) descriptor)->other_tags)) + if (memcmp (tag_ul, &_single_sequence_ul, 16) == 0) { + if (tag_size != 1) + goto error; + descriptor->single_sequence = GST_READ_UINT8 (tag_data); + GST_DEBUG (" single sequence = %s", + (descriptor->single_sequence) ? "yes" : "no"); + ret = TRUE; + } else if (memcmp (tag_ul, &_constant_b_frames_ul, 16) == 0) { + descriptor->const_b_frames = GST_READ_UINT8 (tag_data); + GST_DEBUG (" constant b frames = %s", + } else if (memcmp (tag_ul, &_coded_content_type_ul, 16) == 0) { + descriptor->coded_content_type = GST_READ_UINT8 (tag_data); + GST_DEBUG (" coded content type = %u", descriptor->coded_content_type); + } else if (memcmp (tag_ul, &_low_delay_ul, 16) == 0) { + descriptor->low_delay = GST_READ_UINT8 (tag_data); + GST_DEBUG (" low delay = %s", (descriptor->low_delay) ? "yes" : "no"); + } else if (memcmp (tag_ul, &_closed_gop_ul, 16) == 0) { + descriptor->closed_gop = GST_READ_UINT8 (tag_data); + GST_DEBUG (" closed gop = %s", (descriptor->closed_gop) ? "yes" : "no"); + } else if (memcmp (tag_ul, &_identical_gop_ul, 16) == 0) { + descriptor->identical_gop = GST_READ_UINT8 (tag_data); + GST_DEBUG (" identical gop = %s", + (descriptor->identical_gop) ? "yes" : "no"); + } else if (memcmp (tag_ul, &_max_gop_ul, 16) == 0) { + if (tag_size != 2) + descriptor->max_gop = GST_READ_UINT16_BE (tag_data); + GST_DEBUG (" max gop = %u", descriptor->max_gop); + } else if (memcmp (tag_ul, &_b_picture_count_ul, 16) == 0) { + descriptor->b_picture_count = GST_READ_UINT16_BE (tag_data); + GST_DEBUG (" b picture count = %u", descriptor->b_picture_count); + } else if (memcmp (tag_ul, &_bitrate_ul, 16) == 0) { + if (tag_size != 4) + descriptor->bitrate = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" bitrate = %u", descriptor->bitrate); + } else if (memcmp (tag_ul, &_profile_and_level_ul, 16) == 0) { + descriptor->profile_and_level = GST_READ_UINT8 (tag_data); + GST_DEBUG (" profile & level = %u", descriptor->profile_and_level); + } else { + ret = + mxf_metadata_cdci_picture_essence_descriptor_handle_tag (d, primer, tag, + tag_data, tag_size); - GST_DEBUG ("Parsed mpeg video descriptors:"); - GST_DEBUG (" single sequence = %s", - (descriptor->single_sequence) ? "yes" : "no"); - GST_DEBUG (" constant b frames = %s", - GST_DEBUG (" coded content type = %u", descriptor->coded_content_type); - GST_DEBUG (" low delay = %s", (descriptor->low_delay) ? "yes" : "no"); - GST_DEBUG (" closed gop = %s", (descriptor->closed_gop) ? "yes" : "no"); - GST_DEBUG (" identical gop = %s", - (descriptor->identical_gop) ? "yes" : "no"); - GST_DEBUG (" max gop = %u", descriptor->max_gop); - GST_DEBUG (" b picture count = %u", descriptor->b_picture_count); - GST_DEBUG (" bitrate = %u", descriptor->bitrate); - GST_DEBUG (" profile & level = %u", descriptor->profile_and_level); - GST_ERROR ("Invalid mpeg video descriptor"); - mxf_metadata_mpeg_video_descriptor_reset (descriptor); + GST_ERROR ("Invalid mpeg video descriptor tag 0x%04x of size %u", tag, return FALSE; Index: mxfmpeg.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h,v --- mxfmpeg.h 22 Nov 2008 14:42:07 -0000 1.2 +++ mxfmpeg.h 25 Nov 2008 09:38:26 -0000 1.3 @@ -49,7 +49,7 @@ guint8 profile_and_level; } MXFMetadataMPEGVideoDescriptor; -gboolean mxf_metadata_mpeg_video_descriptor_parse (const MXFUL *key, MXFMetadataMPEGVideoDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean mxf_metadata_mpeg_video_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size); void mxf_metadata_mpeg_video_descriptor_reset (MXFMetadataMPEGVideoDescriptor *descriptor); gboolean mxf_is_mpeg_video_essence_track (const MXFMetadataTrack *track); Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mxfparse.c 24 Nov 2008 10:41:13 -0000 1.4 +++ mxfparse.c 25 Nov 2008 09:38:26 -0000 1.5 @@ -406,6 +406,8 @@ memset (pack, 0, sizeof (MXFPartitionPack)); + GST_DEBUG ("Parsing partition pack:"); if (key->u[13] == 0x02) pack->type = MXF_PARTITION_PACK_HEADER; else if (key->u[13] == 0x03) @@ -413,9 +415,16 @@ else if (key->u[13] == 0x04) pack->type = MXF_PARTITION_PACK_FOOTER; [...2492 lines suppressed...] DFLT: default: if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size, &locator->other_tags)) goto error; @@ -2660,13 +2509,6 @@ size -= 4 + tag_size; - GST_DEBUG ("Parsed locator:"); - GST_DEBUG (" instance uid = %s", mxf_ul_to_string (&locator->instance_uid, - str)); - GST_DEBUG (" generation uid = %s", - mxf_ul_to_string (&locator->generation_uid, str)); - GST_DEBUG (" location = %s", GST_STR_NULL (locator->location)); return TRUE; Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v --- mxfparse.h 22 Nov 2008 14:42:08 -0000 1.2 +++ mxfparse.h 25 Nov 2008 09:38:26 -0000 1.3 @@ -24,6 +24,10 @@ typedef GstFlowReturn (*MXFEssenceElementHandler) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataGenericPackage *package, MXFMetadataTrack *track, MXFMetadataStructuralComponent *component, gpointer mapping_data, GstBuffer **outbuf); +typedef gboolean (*MXFMetadataDescriptorHandleTag) (MXFMetadataGenericDescriptor *descriptor, +typedef void (*MXFMetadataDescriptorReset) (MXFMetadataGenericDescriptor *descriptor); gchar * mxf_ul_to_string (const MXFUL *ul, gchar str[48]); gboolean mxf_ul_is_equal (const MXFUL *a, const MXFUL *b); gboolean mxf_ul_is_zero (const MXFUL *ul); @@ -104,22 +108,31 @@ gboolean mxf_metadata_structural_component_parse (const MXFUL *key, MXFMetadataStructuralComponent *component, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); void mxf_metadata_structural_component_reset (MXFMetadataStructuralComponent *component); -gboolean mxf_metadata_generic_descriptor_parse (const MXFUL *key, MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean +mxf_metadata_descriptor_parse (const MXFUL * key, MXFMetadataGenericDescriptor * descriptor, const MXFPrimerPack * primer, guint16 type, const guint8 * data, guint size, MXFMetadataDescriptorHandleTag handle_tag, MXFMetadataDescriptorReset reset); +gboolean mxf_metadata_generic_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, void mxf_metadata_generic_descriptor_reset (MXFMetadataGenericDescriptor *descriptor); -gboolean mxf_metadata_file_descriptor_parse (const MXFUL *key, MXFMetadataFileDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean mxf_metadata_file_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, void mxf_metadata_file_descriptor_reset (MXFMetadataFileDescriptor *descriptor); -gboolean mxf_metadata_generic_sound_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericSoundEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean mxf_metadata_generic_sound_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, void mxf_metadata_generic_sound_essence_descriptor_reset (MXFMetadataGenericSoundEssenceDescriptor *descriptor); -gboolean mxf_metadata_generic_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataGenericPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean mxf_metadata_generic_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, void mxf_metadata_generic_picture_essence_descriptor_reset (MXFMetadataGenericPictureEssenceDescriptor *descriptor); -gboolean mxf_metadata_cdci_picture_essence_descriptor_parse (const MXFUL *key, MXFMetadataCDCIPictureEssenceDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, void mxf_metadata_cdci_picture_essence_descriptor_reset (MXFMetadataCDCIPictureEssenceDescriptor *descriptor); -gboolean mxf_metadata_multiple_descriptor_parse (const MXFUL *key, MXFMetadataMultipleDescriptor *descriptor, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); +gboolean mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, void mxf_metadata_multiple_descriptor_reset (MXFMetadataMultipleDescriptor *descriptor); gboolean mxf_metadata_locator_parse (const MXFUL *key, MXFMetadataLocator *locator, const MXFPrimerPack *primer, guint16 type, const guint8 *data, guint size); |
From: <sl...@ke...> - 2008-11-25 10:26:31
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Tue Nov 25 2008 10:26:25 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), (gst_mxf_demux_handle_metadata_generic_descriptor), (gst_mxf_demux_handle_metadata_file_descriptor), (gst_mxf_demux_handle_metadata_multiple_descriptor), (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor), (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), (gst_mxf_demux_handle_header_metadata_resolve_references), (gst_mxf_demux_handle_metadata): * gst/mxf/mxfdemux.h: * gst/mxf/mxfparse.c: (mxf_metadata_rgba_picture_essence_descriptor_handle_tag), (mxf_metadata_rgba_picture_essence_descriptor_reset): * gst/mxf/mxfparse.h: * gst/mxf/mxftypes.h: Add initial parsing of RGBA descriptors. Don't initialize descriptor GArray with zeroes. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfdemux.h mxfparse.c mxfparse.h mxftypes.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3739&r2=1.3740 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3739 retrieving revision 1.3740 diff -u -d -r1.3739 -r1.3740 --- ChangeLog 25 Nov 2008 09:38:23 -0000 1.3739 +++ ChangeLog 25 Nov 2008 10:26:09 -0000 1.3740 @@ -1,5 +1,29 @@ 2008-11-25 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), + (gst_mxf_demux_handle_metadata_generic_descriptor), + (gst_mxf_demux_handle_metadata_file_descriptor), + (gst_mxf_demux_handle_metadata_multiple_descriptor), + (gst_mxf_demux_handle_metadata_generic_picture_essence_descriptor), + (gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor), + (gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor), + (gst_mxf_demux_handle_metadata_mpeg_video_descriptor), + (gst_mxf_demux_handle_metadata_generic_sound_essence_descriptor), + (gst_mxf_demux_handle_metadata_wave_audio_essence_descriptor), + (gst_mxf_demux_handle_header_metadata_resolve_references), + (gst_mxf_demux_handle_metadata): + * gst/mxf/mxfdemux.h: + * gst/mxf/mxfparse.c: + (mxf_metadata_rgba_picture_essence_descriptor_handle_tag), + (mxf_metadata_rgba_picture_essence_descriptor_reset): + * gst/mxf/mxfparse.h: + * gst/mxf/mxftypes.h: + Add initial parsing of RGBA descriptors. + + Don't initialize descriptor GArray with zeroes. +2008-11-25 Sebastian Dröge <seb...@co...> * gst/mxf/mxfaes-bwf.c: (mxf_metadata_wave_audio_essence_descriptor_handle_tag): * gst/mxf/mxfaes-bwf.h: Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- mxfdemux.c 25 Nov 2008 09:38:26 -0000 1.7 +++ mxfdemux.c 25 Nov 2008 10:26:11 -0000 1.8 @@ -289,6 +289,15 @@ demux->cdci_picture_essence_descriptor = NULL; } + if (demux->rgba_picture_essence_descriptor) { + for (i = 0; i < demux->rgba_picture_essence_descriptor->len; i++) + mxf_metadata_rgba_picture_essence_descriptor_reset (&g_array_index + (demux->rgba_picture_essence_descriptor, + MXFMetadataRGBAPictureEssenceDescriptor, i)); + g_array_free (demux->rgba_picture_essence_descriptor, TRUE); + demux->rgba_picture_essence_descriptor = NULL; + } if (demux->mpeg_video_descriptor) { for (i = 0; i < demux->mpeg_video_descriptor->len; i++) mxf_metadata_mpeg_video_descriptor_reset (&g_array_index @@ -722,7 +731,7 @@ if (!demux->generic_descriptor) demux->generic_descriptor = - g_array_new (FALSE, TRUE, sizeof (MXFMetadataGenericDescriptor)); + g_array_new (FALSE, FALSE, sizeof (MXFMetadataGenericDescriptor)); g_array_append_val (demux->generic_descriptor, descriptor); @@ -754,7 +763,7 @@ if (!demux->file_descriptor) demux->file_descriptor = - g_array_new (FALSE, TRUE, sizeof (MXFMetadataFileDescriptor)); + g_array_new (FALSE, FALSE, sizeof (MXFMetadataFileDescriptor)); g_array_append_val (demux->file_descriptor, descriptor); @@ -787,7 +796,7 @@ if (!demux->multiple_descriptor) demux->multiple_descriptor = - g_array_new (FALSE, TRUE, sizeof (MXFMetadataMultipleDescriptor)); + g_array_new (FALSE, FALSE, sizeof (MXFMetadataMultipleDescriptor)); g_array_append_val (demux->multiple_descriptor, descriptor); @@ -821,7 +830,7 @@ if (!demux->generic_picture_essence_descriptor) demux->generic_picture_essence_descriptor = - g_array_new (FALSE, TRUE, + g_array_new (FALSE, FALSE, sizeof (MXFMetadataGenericPictureEssenceDescriptor)); g_array_append_val (demux->generic_picture_essence_descriptor, descriptor); @@ -856,7 +865,7 @@ if (!demux->cdci_picture_essence_descriptor) demux->cdci_picture_essence_descriptor = sizeof (MXFMetadataCDCIPictureEssenceDescriptor)); g_array_append_val (demux->cdci_picture_essence_descriptor, descriptor); @@ -865,6 +874,41 @@ } static GstFlowReturn +gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor (GstMXFDemux * + demux, const MXFUL * key, guint16 type, GstBuffer * buffer) +{ + MXFMetadataRGBAPictureEssenceDescriptor descriptor; + memset (&descriptor, 0, sizeof (descriptor)); + GST_DEBUG_OBJECT (demux, + "Handling metadata RGBA picture essence descriptor of size %u" + " at offset %" G_GUINT64_FORMAT " with type 0x%04d", + GST_BUFFER_SIZE (buffer), demux->offset, type); + if (!mxf_metadata_descriptor_parse (key, + (MXFMetadataGenericDescriptor *) & descriptor, &demux->primer, + type, GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer), + (MXFMetadataDescriptorHandleTag) + mxf_metadata_rgba_picture_essence_descriptor_handle_tag, + (MXFMetadataDescriptorReset) + mxf_metadata_rgba_picture_essence_descriptor_reset)) { + GST_ERROR_OBJECT (demux, + "Parsing metadata RGBA picture essence descriptor failed"); + return GST_FLOW_ERROR; + if (!demux->rgba_picture_essence_descriptor) + demux->rgba_picture_essence_descriptor = + sizeof (MXFMetadataRGBAPictureEssenceDescriptor)); + g_array_append_val (demux->rgba_picture_essence_descriptor, descriptor); + return GST_FLOW_OK; +} +static GstFlowReturn gst_mxf_demux_handle_metadata_mpeg_video_descriptor (GstMXFDemux * demux, const MXFUL * key, guint16 type, GstBuffer * buffer) { @@ -890,7 +934,7 @@ if (!demux->mpeg_video_descriptor) demux->mpeg_video_descriptor = - g_array_new (FALSE, TRUE, sizeof (MXFMetadataMPEGVideoDescriptor)); + g_array_new (FALSE, FALSE, sizeof (MXFMetadataMPEGVideoDescriptor)); g_array_append_val (demux->mpeg_video_descriptor, descriptor); @@ -924,7 +968,7 @@ if (!demux->generic_sound_essence_descriptor) demux->generic_sound_essence_descriptor = sizeof (MXFMetadataGenericSoundEssenceDescriptor)); g_array_append_val (demux->generic_sound_essence_descriptor, descriptor); @@ -959,7 +1003,7 @@ if (!demux->wave_audio_essence_descriptor) demux->wave_audio_essence_descriptor = sizeof (MXFMetadataWaveAudioEssenceDescriptor)); g_array_append_val (demux->wave_audio_essence_descriptor, descriptor); @@ -1033,6 +1077,13 @@ MXFMetadataCDCIPictureEssenceDescriptor, i)); } + for (i = 0; i < demux->rgba_picture_essence_descriptor->len; i++) { + g_ptr_array_add (demux->descriptor, + &g_array_index (demux->rgba_picture_essence_descriptor, + } for (i = 0; i < demux->mpeg_video_descriptor->len; i++) { g_ptr_array_add (demux->descriptor, @@ -1173,8 +1224,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1827,7 +1879,6 @@ gst_mxf_demux_handle_metadata_structural_component (demux, key, type, buffer); break; - case MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR: case MXF_METADATA_GENERIC_DATA_ESSENCE_DESCRIPTOR: ret = gst_mxf_demux_handle_metadata_generic_descriptor (demux, @@ -1848,6 +1899,11 @@ gst_mxf_demux_handle_metadata_cdci_picture_essence_descriptor (demux, + case MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR: + ret = + gst_mxf_demux_handle_metadata_rgba_picture_essence_descriptor (demux, + key, type, buffer); + break; case MXF_METADATA_MPEG_VIDEO_DESCRIPTOR: gst_mxf_demux_handle_metadata_mpeg_video_descriptor (demux, Index: mxfdemux.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mxfdemux.h 21 Nov 2008 10:27:14 -0000 1.1 +++ mxfdemux.h 25 Nov 2008 10:26:11 -0000 1.2 @@ -88,6 +88,7 @@ GArray *generic_sound_essence_descriptor; GArray *generic_picture_essence_descriptor; GArray *cdci_picture_essence_descriptor; + GArray *rgba_picture_essence_descriptor; GArray *mpeg_video_descriptor; GArray *wave_audio_essence_descriptor; GArray *multiple_descriptor; Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- mxfparse.c 25 Nov 2008 09:38:26 -0000 1.5 +++ mxfparse.c 25 Nov 2008 10:26:11 -0000 1.6 @@ -2389,6 +2389,79 @@ gboolean + mxf_metadata_rgba_picture_essence_descriptor_handle_tag + (MXFMetadataGenericDescriptor * d, const MXFPrimerPack * primer, + guint16 tag, const guint8 * tag_data, guint16 tag_size) + MXFMetadataRGBAPictureEssenceDescriptor *descriptor = + (MXFMetadataRGBAPictureEssenceDescriptor *) d; + gboolean ret = FALSE; + switch (tag) { + case 0x3406: + if (tag_size != 4) + goto error; + descriptor->component_max_ref = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" component max ref = %u", descriptor->component_max_ref); + case 0x3407: + descriptor->component_min_ref = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" component min ref = %u", descriptor->component_min_ref); + case 0x3408: + descriptor->alpha_max_ref = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" alpha max ref = %u", descriptor->alpha_max_ref); + case 0x3409: + descriptor->alpha_min_ref = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" alpha min ref = %u", descriptor->alpha_min_ref); + case 0x3405: + if (tag_size != 1) + descriptor->scanning_direction = GST_READ_UINT8 (tag_data); + GST_DEBUG (" scanning direction = %u", descriptor->scanning_direction); + case 0x3401: + case 0x3403: + case 0x3404: + /* TODO: handle this */ + GST_WARNING (" tag 0x%04x not implemented yet", tag); + default: + mxf_metadata_generic_picture_essence_descriptor_handle_tag (d, primer, + tag, tag_data, tag_size); + return ret; +error: + GST_ERROR ("Invalid RGBA picture essence descriptor tag 0x%04x of size %u", + tag, tag_size); + return TRUE; +void mxf_metadata_rgba_picture_essence_descriptor_reset + (MXFMetadataRGBAPictureEssenceDescriptor * descriptor) + g_return_if_fail (descriptor != NULL); + mxf_metadata_generic_picture_essence_descriptor_reset ( + (MXFMetadataGenericPictureEssenceDescriptor *) descriptor); + memset (descriptor, 0, sizeof (MXFMetadataRGBAPictureEssenceDescriptor)); +gboolean mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataGenericDescriptor * d, const MXFPrimerPack * primer, guint16 tag, const guint8 * tag_data, guint16 tag_size) Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mxfparse.h 25 Nov 2008 09:38:26 -0000 1.3 +++ mxfparse.h 25 Nov 2008 10:26:11 -0000 1.4 @@ -131,6 +131,10 @@ const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size); void mxf_metadata_cdci_picture_essence_descriptor_reset (MXFMetadataCDCIPictureEssenceDescriptor *descriptor); +gboolean mxf_metadata_rgba_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, + const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size); +void mxf_metadata_rgba_picture_essence_descriptor_reset (MXFMetadataRGBAPictureEssenceDescriptor *descriptor); gboolean mxf_metadata_multiple_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, void mxf_metadata_multiple_descriptor_reset (MXFMetadataMultipleDescriptor *descriptor); Index: mxftypes.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h,v --- mxftypes.h 21 Nov 2008 10:27:15 -0000 1.1 +++ mxftypes.h 25 Nov 2008 10:26:11 -0000 1.2 @@ -149,6 +149,7 @@ typedef struct _MXFMetadataFileDescriptor MXFMetadataFileDescriptor; typedef struct _MXFMetadataGenericPictureEssenceDescriptor MXFMetadataGenericPictureEssenceDescriptor; typedef struct _MXFMetadataCDCIPictureEssenceDescriptor MXFMetadataCDCIPictureEssenceDescriptor; +typedef struct _MXFMetadataRGBAPictureEssenceDescriptor MXFMetadataRGBAPictureEssenceDescriptor; typedef struct _MXFMetadataGenericSoundEssenceDescriptor MXFMetadataGenericSoundEssenceDescriptor; typedef struct _MXFMetadataMultipleDescriptor MXFMetadataMultipleDescriptor; typedef struct _MXFMetadataLocator MXFMetadataLocator; @@ -422,6 +423,18 @@ guint32 color_range; }; +struct _MXFMetadataRGBAPictureEssenceDescriptor { + MXFMetadataGenericPictureEssenceDescriptor parent; + guint32 component_max_ref; + guint32 component_min_ref; + guint32 alpha_max_ref; + guint32 alpha_min_ref; + guint8 scanning_direction; + /* TODO: pixel layout, palette & palette layout */ +}; struct _MXFMetadataGenericSoundEssenceDescriptor { MXFMetadataFileDescriptor parent; |
From: <sl...@ke...> - 2008-11-25 14:49:54
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Tue Nov 25 2008 14:49:48 UTC Log message: * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_create_caps): * gst/mxf/mxfparse.c: (mxf_metadata_generic_picture_essence_descriptor_set_caps): * gst/mxf/mxfparse.h: Set video dimensions and pixel aspect ratio on the caps. Modified files: . : ChangeLog gst/mxf : mxfmpeg.c mxfparse.c mxfparse.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3740&r2=1.3741 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3740 retrieving revision 1.3741 diff -u -d -r1.3740 -r1.3741 --- ChangeLog 25 Nov 2008 10:26:09 -0000 1.3740 +++ ChangeLog 25 Nov 2008 14:49:31 -0000 1.3741 @@ -1,5 +1,13 @@ 2008-11-25 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_create_caps): + * gst/mxf/mxfparse.c: + (mxf_metadata_generic_picture_essence_descriptor_set_caps): + * gst/mxf/mxfparse.h: + Set video dimensions and pixel aspect ratio on the caps. + +2008-11-25 Sebastian Dröge <seb...@co...> * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata), (gst_mxf_demux_handle_metadata_generic_descriptor), (gst_mxf_demux_handle_metadata_file_descriptor), Index: mxfmpeg.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mxfmpeg.c 25 Nov 2008 09:38:26 -0000 1.3 +++ mxfmpeg.c 25 Nov 2008 14:49:34 -0000 1.4 @@ -23,6 +23,7 @@ /* TODO: * - Handle PES streams + * - Fix TS/PS demuxers to forward timestamps */ #ifdef HAVE_CONFIG_H @@ -242,7 +243,9 @@ { MXFMetadataMPEGVideoDescriptor *d = NULL; MXFMetadataFileDescriptor *f = NULL; + MXFMetadataGenericPictureEssenceDescriptor *p = NULL; guint i; + GstCaps *caps = NULL; g_return_val_if_fail (package != NULL, NULL); g_return_val_if_fail (track != NULL, NULL); @@ -257,12 +260,16 @@ MXF_METADATA_MPEG_VIDEO_DESCRIPTOR) { d = (MXFMetadataMPEGVideoDescriptor *) track->descriptor[i]; f = track->descriptor[i]; + p = (MXFMetadataGenericPictureEssenceDescriptor *) track->descriptor[i]; + break; + } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == + MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR || + ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == + MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR) { + f = track->descriptor[i]; break; } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == - MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR - || ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == - MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR MXF_METADATA_FILE_DESCRIPTOR) { } @@ -278,7 +285,7 @@ if (f->essence_container.u[13] == 0x04) { /* FIXME: get mpeg version somehow */ GST_DEBUG ("Found MPEG ES stream"); - return gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, + caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); } else if (f->essence_container.u[13] == 0x07) { GST_ERROR ("MPEG PES streams not supported yet"); @@ -286,11 +293,16 @@ } else if (f->essence_container.u[13] == 0x08) { GST_DEBUG ("Found MPEG PS stream"); "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); } else if (f->essence_container.u[13] == 0x09) { GST_DEBUG ("Found MPEG TS stream"); - return gst_caps_new_simple ("video/mpegts", NULL); + caps = gst_caps_new_simple ("video/mpegts", NULL); } - return NULL; + if (p) + mxf_metadata_generic_picture_essence_descriptor_set_caps (p, caps); + return caps; } Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mxfparse.c 25 Nov 2008 10:26:11 -0000 1.6 +++ mxfparse.c 25 Nov 2008 14:49:34 -0000 1.7 @@ -2278,11 +2278,38 @@ memset (descriptor, 0, sizeof (MXFMetadataGenericPictureEssenceDescriptor)); +void mxf_metadata_generic_picture_essence_descriptor_set_caps + (MXFMetadataGenericPictureEssenceDescriptor * descriptor, GstCaps * caps) +{ + guint par_n, par_d; + guint width, height; + g_return_if_fail (descriptor != NULL); + g_return_if_fail (GST_IS_CAPS (caps)); + width = descriptor->stored_width; + height = descriptor->stored_height; + if (width == 0 || height == 0) + return; + gst_caps_set_simple (caps, "width", G_TYPE_INT, width, "height", G_TYPE_INT, + height, NULL); + if (descriptor->aspect_ratio.n == 0 || descriptor->aspect_ratio.d == 0) + par_n = height * descriptor->aspect_ratio.n; + par_d = width * descriptor->aspect_ratio.d; + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + par_n, par_d, NULL); +} gboolean mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor * d, const MXFPrimerPack * primer, - guint16 tag, const guint8 * tag_data, guint16 tag_size) -{ + guint16 tag, const guint8 * tag_data, guint16 tag_size) { MXFMetadataCDCIPictureEssenceDescriptor *descriptor = (MXFMetadataCDCIPictureEssenceDescriptor *) d; gboolean ret = FALSE; Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mxfparse.h 25 Nov 2008 10:26:11 -0000 1.4 +++ mxfparse.h 25 Nov 2008 14:49:34 -0000 1.5 @@ -126,6 +126,7 @@ gboolean mxf_metadata_generic_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size); void mxf_metadata_generic_picture_essence_descriptor_reset (MXFMetadataGenericPictureEssenceDescriptor *descriptor); +void mxf_metadata_generic_picture_essence_descriptor_set_caps (MXFMetadataGenericPictureEssenceDescriptor *descriptor, GstCaps *caps); gboolean mxf_metadata_cdci_picture_essence_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, |
From: <sl...@ke...> - 2008-11-26 10:37:51
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Wed Nov 26 2008 10:37:48 UTC Log message: * gst/mxf/mxfaes-bwf.c: (mxf_metadata_wave_audio_essence_descriptor_reset): * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_reset): * gst/mxf/mxfparse.c: (mxf_metadata_file_descriptor_handle_tag), (mxf_metadata_file_descriptor_reset), (mxf_metadata_generic_sound_essence_descriptor_reset), (mxf_metadata_generic_picture_essence_descriptor_reset), (mxf_metadata_cdci_picture_essence_descriptor_reset), (mxf_metadata_rgba_picture_essence_descriptor_reset), (mxf_metadata_multiple_descriptor_reset): * gst/mxf/mxfparse.h: When memset'ing the descriptors to zeroes only touch the part of this descriptor, not it's parent type. Set correct default values for all metadata fields. Modified files: . : ChangeLog gst/mxf : mxfaes-bwf.c mxfmpeg.c mxfparse.c mxfparse.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3745&r2=1.3746 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3745 retrieving revision 1.3746 diff -u -d -r1.3745 -r1.3746 --- ChangeLog 26 Nov 2008 04:57:21 -0000 1.3745 +++ ChangeLog 26 Nov 2008 10:37:31 -0000 1.3746 @@ -1,3 +1,21 @@ +2008-11-26 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfaes-bwf.c: + (mxf_metadata_wave_audio_essence_descriptor_reset): + * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_reset): + * gst/mxf/mxfparse.c: (mxf_metadata_file_descriptor_handle_tag), + (mxf_metadata_file_descriptor_reset), + (mxf_metadata_generic_sound_essence_descriptor_reset), + (mxf_metadata_generic_picture_essence_descriptor_reset), + (mxf_metadata_cdci_picture_essence_descriptor_reset), + (mxf_metadata_rgba_picture_essence_descriptor_reset), + (mxf_metadata_multiple_descriptor_reset): + * gst/mxf/mxfparse.h: + When memset'ing the descriptors to zeroes only touch the part + of this descriptor, not it's parent type. + Set correct default values for all metadata fields. 2008-11-25 David Schleef <ds...@sc...> * gst/mpegdemux/gstmpegtsdemux.c: Index: mxfaes-bwf.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mxfaes-bwf.c 25 Nov 2008 09:38:26 -0000 1.3 +++ mxfaes-bwf.c 26 Nov 2008 10:37:33 -0000 1.4 @@ -179,7 +179,9 @@ mxf_metadata_generic_sound_essence_descriptor_reset ( (MXFMetadataGenericSoundEssenceDescriptor *) descriptor); - memset (descriptor, 0, sizeof (MXFMetadataWaveAudioEssenceDescriptor)); + MXF_METADATA_DESCRIPTOR_CLEAR (descriptor, + MXFMetadataWaveAudioEssenceDescriptor, + MXFMetadataGenericSoundEssenceDescriptor); } gboolean Index: mxfmpeg.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mxfmpeg.c 25 Nov 2008 14:49:34 -0000 1.4 +++ mxfmpeg.c 26 Nov 2008 10:37:33 -0000 1.5 @@ -190,7 +190,8 @@ mxf_metadata_cdci_picture_essence_descriptor_reset ( (MXFMetadataCDCIPictureEssenceDescriptor *) descriptor); - memset (descriptor, 0, sizeof (MXFMetadataMPEGVideoDescriptor)); + MXF_METADATA_DESCRIPTOR_CLEAR (descriptor, MXFMetadataMPEGVideoDescriptor, + MXFMetadataCDCIPictureEssenceDescriptor); Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- mxfparse.c 25 Nov 2008 14:49:34 -0000 1.7 +++ mxfparse.c 26 Nov 2008 10:37:33 -0000 1.8 @@ -1894,8 +1894,6 @@ gboolean ret = FALSE; gchar str[48]; - descriptor->parent.is_file_descriptor = TRUE; - switch (tag) { case 0x3006: if (tag_size != 4) @@ -1957,7 +1955,10 @@ mxf_metadata_generic_descriptor_reset ((MXFMetadataGenericDescriptor *) descriptor); - memset (descriptor, 0, sizeof (MXFMetadataFileDescriptor)); + MXF_METADATA_DESCRIPTOR_CLEAR (descriptor, MXFMetadataFileDescriptor, + MXFMetadataGenericDescriptor); + descriptor->parent.is_file_descriptor = TRUE; @@ -2053,7 +2054,11 @@ mxf_metadata_file_descriptor_reset ((MXFMetadataFileDescriptor *) descriptor); - memset (descriptor, 0, sizeof (MXFMetadataGenericSoundEssenceDescriptor)); + MXFMetadataGenericSoundEssenceDescriptor, MXFMetadataFileDescriptor); + descriptor->audio_sampling_rate.n = 48000; + descriptor->audio_sampling_rate.d = 1; @@ -2275,7 +2280,10 @@ - memset (descriptor, 0, sizeof (MXFMetadataGenericPictureEssenceDescriptor)); + MXFMetadataGenericPictureEssenceDescriptor, MXFMetadataFileDescriptor); + descriptor->signal_standard = 1; void mxf_metadata_generic_picture_essence_descriptor_set_caps @@ -2412,7 +2420,9 @@ mxf_metadata_generic_picture_essence_descriptor_reset ( (MXFMetadataGenericPictureEssenceDescriptor *) descriptor); - memset (descriptor, 0, sizeof (MXFMetadataCDCIPictureEssenceDescriptor)); + MXFMetadataCDCIPictureEssenceDescriptor, + MXFMetadataGenericPictureEssenceDescriptor); @@ -2485,7 +2495,12 @@ - memset (descriptor, 0, sizeof (MXFMetadataRGBAPictureEssenceDescriptor)); + MXFMetadataRGBAPictureEssenceDescriptor, + descriptor->component_max_ref = 255; + descriptor->alpha_max_ref = 255; @@ -2550,7 +2565,8 @@ - memset (descriptor, 0, sizeof (MXFMetadataMultipleDescriptor)); + MXF_METADATA_DESCRIPTOR_CLEAR (descriptor, MXFMetadataMultipleDescriptor, + MXFMetadataFileDescriptor); Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- mxfparse.h 25 Nov 2008 14:49:34 -0000 1.5 +++ mxfparse.h 26 Nov 2008 10:37:34 -0000 1.6 @@ -20,6 +20,8 @@ #ifndef __MXF_PARSE_H__ #define __MXF_PARSE_H__ +#include <string.h> #include "mxftypes.h" typedef GstFlowReturn (*MXFEssenceElementHandler) (const MXFUL *key, GstBuffer *buffer, GstCaps *caps, MXFMetadataGenericPackage *package, MXFMetadataTrack *track, MXFMetadataStructuralComponent *component, gpointer mapping_data, GstBuffer **outbuf); @@ -111,6 +113,12 @@ mxf_metadata_descriptor_parse (const MXFUL * key, MXFMetadataGenericDescriptor * descriptor, const MXFPrimerPack * primer, guint16 type, const guint8 * data, guint size, MXFMetadataDescriptorHandleTag handle_tag, MXFMetadataDescriptorReset reset); +#define MXF_METADATA_DESCRIPTOR_CLEAR(descriptor, type, parent_type) \ + G_STMT_START { \ + guint8 *___data = (guint8 *) descriptor + sizeof (parent_type); \ + memset (___data, 0, sizeof (type) - sizeof (parent_type)); \ + } G_STMT_END gboolean mxf_metadata_generic_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size); void mxf_metadata_generic_descriptor_reset (MXFMetadataGenericDescriptor *descriptor); |
From: <sl...@ke...> - 2008-11-26 12:07:05
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Wed Nov 26 2008 11:30:42 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_pad_init), (gst_mxf_demux_reset_metadata), (gst_mxf_demux_combine_flows), (gst_mxf_demux_handle_generic_container_essence_element): Properly combine flow returns of the source pads. Improve debugging and reset pad fields together with the metadata to prevent invalid memory references. * gst/mxf/mxfparse.c: (mxf_metadata_preface_parse): Fix typo. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfparse.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3746&r2=1.3747 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3746 retrieving revision 1.3747 diff -u -d -r1.3746 -r1.3747 --- ChangeLog 26 Nov 2008 10:37:31 -0000 1.3746 +++ ChangeLog 26 Nov 2008 11:30:26 -0000 1.3747 @@ -1,5 +1,18 @@ 2008-11-26 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_pad_init), + (gst_mxf_demux_reset_metadata), (gst_mxf_demux_combine_flows), + (gst_mxf_demux_handle_generic_container_essence_element): + Properly combine flow returns of the source pads. + + Improve debugging and reset pad fields together with the + metadata to prevent invalid memory references. + * gst/mxf/mxfparse.c: (mxf_metadata_preface_parse): + Fix typo. +2008-11-26 Sebastian Dröge <seb...@co...> * gst/mxf/mxfaes-bwf.c: (mxf_metadata_wave_audio_essence_descriptor_reset): * gst/mxf/mxfmpeg.c: (mxf_metadata_mpeg_video_descriptor_reset): Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- mxfdemux.c 25 Nov 2008 10:26:11 -0000 1.8 +++ mxfdemux.c 26 Nov 2008 11:30:28 -0000 1.9 @@ -76,6 +76,8 @@ MXFMetadataTrackType track_type; gboolean need_segment; + GstFlowReturn last_flow; guint64 essence_element_count; MXFEssenceElementHandler handle_essence_element; gpointer mapping_data; @@ -130,7 +132,7 @@ static void gst_mxf_pad_init (GstMXFPad * pad) { - + pad->last_flow = GST_FLOW_OK; } static gboolean gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event); @@ -182,6 +184,18 @@ demux->current_package = NULL; + if (demux->src) { + for (i = 0; i < demux->src->len; i++) { + GstMXFPad *pad = g_ptr_array_index (demux->src, i); + pad->material_track = NULL; + pad->material_package = NULL; + pad->component = NULL; + pad->source_track = NULL; + pad->source_package = NULL; + } + } mxf_metadata_preface_reset (&demux->preface); if (demux->identification) { @@ -377,6 +391,40 @@ static GstFlowReturn +gst_mxf_demux_combine_flows (GstMXFDemux * demux, + GstMXFPad * pad, GstFlowReturn ret) +{ + guint i; + /* store the value */ + pad->last_flow = ret; + /* any other error that is not-linked can be returned right away */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + /* only return NOT_LINKED if all other pads returned NOT_LINKED */ + g_assert (demux->src->len != 0); + for (i = 0; i < demux->src->len; i++) { + GstMXFPad *opad = g_ptr_array_index (demux->src, i); + if (opad == NULL) + continue; + ret = opad->last_flow; + /* some other return value (must be SUCCESS but we can return + * other values as well) */ + if (ret != GST_FLOW_NOT_LINKED) + goto done; + /* if we get here, all other pads were unlinked and we return + * NOT_LINKED then */ +done: + GST_LOG_OBJECT (demux, "combined return %s", gst_flow_get_name (ret)); + return ret; +} +static GstFlowReturn gst_mxf_demux_pull_range (GstMXFDemux * demux, guint64 offset, guint size, GstBuffer ** buffer) @@ -1224,9 +1272,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1964,6 +2011,11 @@ "Handling generic container essence element of size %u" " at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset); + GST_DEBUG_OBJECT (demux, " type = 0x%02x", key->u[12]); + GST_DEBUG_OBJECT (demux, " essence element count = 0x%02x", key->u[13]); + GST_DEBUG_OBJECT (demux, " essence element type = 0x%02x", key->u[14]); + GST_DEBUG_OBJECT (demux, " essence element number = 0x%02x", key->u[15]); if (!demux->current_package) { GST_ERROR_OBJECT (demux, "No package selected yet"); return GST_FLOW_ERROR; @@ -2055,6 +2107,7 @@ if (outbuf) { ret = gst_pad_push (GST_PAD_CAST (pad), outbuf); + ret = gst_mxf_demux_combine_flows (demux, pad, ret); } return ret; Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v --- mxfparse.c 26 Nov 2008 10:37:33 -0000 1.8 +++ mxfparse.c 26 Nov 2008 11:30:28 -0000 1.9 @@ -769,8 +769,7 @@ if (tag_size < 8) goto error; len = GST_READ_UINT32_BE (tag_data); - GST_DEBUG (" number of identifications = %u", - preface->n_identifications); + GST_DEBUG (" number of identifications = %u", len); if (len == 0) if (GST_READ_UINT32_BE (tag_data + 4) != 16) |
From: <sl...@ke...> - 2008-11-27 08:49:25
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Thu Nov 27 2008 08:49:22 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), (gst_mxf_demux_handle_klv_packet): * gst/mxf/mxfdemux.h: Only try to pull the footer metadata once and not on every KLV packet if it failed before. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfdemux.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3750&r2=1.3751 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3750 retrieving revision 1.3751 diff -u -d -r1.3750 -r1.3751 --- ChangeLog 26 Nov 2008 12:40:17 -0000 1.3750 +++ ChangeLog 27 Nov 2008 08:49:06 -0000 1.3751 @@ -1,3 +1,11 @@ +2008-11-27 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), + (gst_mxf_demux_handle_klv_packet): + * gst/mxf/mxfdemux.h: + Only try to pull the footer metadata once and not on every KLV packet + if it failed before. 2008-11-26 Wim Taymans <wim...@co...> * gst/rtpmanager/rtpsession.c: (obtain_source), Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- mxfdemux.c 26 Nov 2008 11:30:28 -0000 1.9 +++ mxfdemux.c 27 Nov 2008 08:49:07 -0000 1.10 @@ -363,6 +363,8 @@ demux->footer_partition_pack_offset = 0; demux->offset = 0; + demux->pull_footer_metadata = TRUE; demux->run_in = -1; memset (&demux->current_package_uid, 0, sizeof (MXFUMID)); @@ -1272,8 +1274,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -2369,13 +2372,15 @@ GstFlowReturn ret = GST_FLOW_OK; /* In pull mode try to get the last metadata */ - if (!demux->final_metadata && demux->random_access && demux->partition.valid + if (demux->pull_footer_metadata && !demux->final_metadata + && demux->random_access && demux->partition.valid && demux->partition.type == MXF_PARTITION_PACK_HEADER && (!demux->partition.closed || !demux->partition.complete) && demux->footer_partition_pack_offset != 0) { GST_DEBUG_OBJECT (demux, "Open or incomplete header partition, trying to get final metadata from the last partitions"); gst_mxf_demux_parse_footer_metadata (demux); + demux->pull_footer_metadata = FALSE; } /* TODO: - Pull random index pack from footer partition? Index: mxfdemux.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mxfdemux.h 25 Nov 2008 10:26:11 -0000 1.2 +++ mxfdemux.h 27 Nov 2008 08:49:08 -0000 1.3 @@ -70,6 +70,7 @@ /* Structural metadata */ gboolean update_metadata; gboolean final_metadata; + gboolean pull_footer_metadata; MXFMetadataPreface preface; GArray *identification; MXFMetadataContentStorage content_storage; |
From: <sl...@ke...> - 2008-11-27 10:10:11
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Thu Nov 27 2008 10:10:07 UTC Log message: * gst/mxf/Makefile.am: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_header_metadata_update_streams), (gst_mxf_demux_handle_klv_packet): * gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track), (mxf_dv_dif_handle_essence_element), (mxf_dv_dif_create_caps): * gst/mxf/mxfdv-dif.h: * gst/mxf/mxfparse.c: (mxf_is_descriptive_metadata): * gst/mxf/mxfparse.h: Add fundamental support for DV-DIF essence streams. Handle descriptive metadata packets as metadata packets. Modified files: . : ChangeLog gst/mxf : Makefile.am mxfdemux.c mxfparse.c mxfparse.h Added files: gst/mxf : mxfdv-dif.c mxfdv-dif.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3751&r2=1.3752 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/Makefile.am.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3751 retrieving revision 1.3752 diff -u -d -r1.3751 -r1.3752 --- ChangeLog 27 Nov 2008 08:49:06 -0000 1.3751 +++ ChangeLog 27 Nov 2008 10:09:51 -0000 1.3752 @@ -1,5 +1,20 @@ 2008-11-27 Sebastian Dröge <seb...@co...> + * gst/mxf/Makefile.am: + * gst/mxf/mxfdemux.c: + (gst_mxf_demux_handle_header_metadata_update_streams), + (gst_mxf_demux_handle_klv_packet): + * gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track), + (mxf_dv_dif_handle_essence_element), (mxf_dv_dif_create_caps): + * gst/mxf/mxfdv-dif.h: + * gst/mxf/mxfparse.c: (mxf_is_descriptive_metadata): + * gst/mxf/mxfparse.h: + Add fundamental support for DV-DIF essence streams. + + Handle descriptive metadata packets as metadata packets. +2008-11-27 Sebastian Dröge <seb...@co...> * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), (gst_mxf_demux_handle_klv_packet): * gst/mxf/mxfdemux.h: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Makefile.am 21 Nov 2008 10:27:13 -0000 1.1 +++ Makefile.am 27 Nov 2008 10:09:52 -0000 1.2 @@ -5,7 +5,8 @@ mxfdemux.c \ mxfparse.c \ mxfaes-bwf.c \ - mxfmpeg.c + mxfmpeg.c \ + mxfdv-dif.c libgstmxf_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstmxf_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) @@ -16,5 +17,6 @@ mxfparse.h \ mxfaes-bwf.h \ mxfmpeg.h \ + mxfdv-dif.h \ mxftypes.h Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- mxfdemux.c 27 Nov 2008 08:49:07 -0000 1.10 +++ mxfdemux.c 27 Nov 2008 10:09:52 -0000 1.11 @@ -33,6 +33,7 @@ #include "mxfparse.h" #include "mxfaes-bwf.h" #include "mxfmpeg.h" +#include "mxfdv-dif.h" #include <string.h> @@ -1274,9 +1275,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1812,14 +1812,26 @@ caps = mxf_mpeg_video_create_caps (source_package, source_track, &pad->tags, &pad->handle_essence_element, &pad->mapping_data); + else if (mxf_is_dv_dif_essence_track (source_track)) + caps = + mxf_dv_dif_create_caps (source_package, source_track, + &pad->tags, &pad->handle_essence_element, &pad->mapping_data); break; case MXF_METADATA_TRACK_SOUND_ESSENCE: if (mxf_is_aes_bwf_essence_track (source_track)) mxf_aes_bwf_create_caps (source_package, source_track, &pad->tags, &pad->handle_essence_element, &pad->mapping_data); case MXF_METADATA_TRACK_DATA_ESSENCE: + if (mxf_is_dv_dif_essence_track (source_track)) default: g_assert_not_reached (); @@ -2391,7 +2403,7 @@ if (demux->update_metadata && !mxf_timestamp_is_unknown (&demux->preface.last_modified_date) - && !mxf_is_metadata (key) + && !mxf_is_metadata (key) && !mxf_is_descriptive_metadata (key) && !mxf_is_fill (key)) { if ((ret = gst_mxf_demux_handle_header_metadata_resolve_references (demux)) != --- NEW FILE: mxfdv-dif.c --- /* GStreamer * Copyright (C) 2008 Sebastian Dröge <seb...@co...> * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Implementation of SMPTE 383M - Mapping DV-DIF data into the MXF * Generic Container #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <gst/gst.h> #include <string.h> #include "mxfdv-dif.h" GST_DEBUG_CATEGORY_EXTERN (mxf_debug); #define GST_CAT_DEFAULT mxf_debug gboolean mxf_is_dv_dif_essence_track (const MXFMetadataTrack * track) { guint i; g_return_val_if_fail (track != NULL, FALSE); if (track->descriptor == NULL) return FALSE; for (i = 0; i < track->n_descriptor; i++) { MXFMetadataFileDescriptor *d = track->descriptor[i]; MXFUL *key = &d->essence_container; /* SMPTE 383M 8 */ if (mxf_is_generic_container_essence_container_label (key) && key->u[12] == 0x02 && key->u[13] == 0x02) return TRUE; } return FALSE; } static GstFlowReturn mxf_dv_dif_handle_essence_element (const MXFUL * key, GstBuffer * buffer, GstCaps * caps, MXFMetadataGenericPackage * package, MXFMetadataTrack * track, MXFMetadataStructuralComponent * component, gpointer mapping_data, GstBuffer ** outbuf) *outbuf = buffer; /* SMPTE 383 6.1.1 */ if (key->u[12] != 0x18 || (key->u[14] != 0x01 && key->u[14] != 0x02)) { GST_ERROR ("Invalid DV-DIF essence element"); return GST_FLOW_ERROR; return GST_FLOW_OK; GstCaps * mxf_dv_dif_create_caps (MXFMetadataGenericPackage * package, MXFMetadataTrack * track, GstTagList ** tags, MXFEssenceElementHandler * handler, gpointer * mapping_data) MXFMetadataFileDescriptor *f = NULL; GstCaps *caps = NULL; g_return_val_if_fail (package != NULL, NULL); g_return_val_if_fail (track != NULL, NULL); if (track->descriptor == NULL) { GST_ERROR ("No descriptor found for this track"); return NULL; if (((MXFMetadataGenericDescriptor *) track->descriptor[i])-> is_file_descriptor && ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type != MXF_METADATA_MULTIPLE_DESCRIPTOR) { f = track->descriptor[i]; } if (!f) { *handler = mxf_dv_dif_handle_essence_element; /* SMPTE 383M 8 */ /* TODO: might be video or audio only, use values of the generic sound/picture * descriptor in the caps in that case * Also dvdemux might not forward timestamps */ if (f->essence_container.u[13] == 0x02) { GST_DEBUG ("Found DV-DIF stream"); caps = gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); return caps; --- NEW FILE: mxfdv-dif.h --- #ifndef __MXF_DV_DIF_H__ #define __MXF_DV_DIF_H__ #include "mxfparse.h" gboolean mxf_is_dv_dif_essence_track (const MXFMetadataTrack *track); mxf_dv_dif_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); #endif /* __MXF_DV_DIF_H__ */ Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.9 diff -u -d -r1.9 -r1.10 --- mxfparse.c 26 Nov 2008 11:30:28 -0000 1.9 +++ mxfparse.c 27 Nov 2008 10:09:53 -0000 1.10 @@ -141,6 +141,18 @@ return (memcmp (key, metadata_key, 13) == 0 && key->u[15] == 0x00); } +/* SMPTE 377M 8.7.3 */ +gboolean +mxf_is_descriptive_metadata (const MXFUL * key) +{ + return (memcmp (key, mxf_key, 4) == 0 && + key->u[4] == 0x02 && + key->u[6] == 0x01 && + key->u[7] == 0x01 && + key->u[8] == 0x0d && + key->u[9] == 0x01 && key->u[10] == 0x04 && key->u[11] == 0x01); +} gboolean mxf_is_random_index_pack (const MXFUL * key) { Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mxfparse.h 26 Nov 2008 10:37:34 -0000 1.6 +++ mxfparse.h 27 Nov 2008 10:09:53 -0000 1.7 @@ -48,6 +48,7 @@ gboolean mxf_is_primer_pack (const MXFUL *key); gboolean mxf_is_metadata (const MXFUL *key); +gboolean mxf_is_descriptive_metadata (const MXFUL *key); gboolean mxf_is_random_index_pack (const MXFUL *key); gboolean mxf_is_index_table_segment (const MXFUL *key); |
From: <sl...@ke...> - 2008-11-27 16:26:59
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Thu Nov 27 2008 16:26:53 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), (gst_mxf_demux_handle_random_index_pack), (gst_mxf_demux_pull_random_index_pack), (gst_mxf_demux_loop): * gst/mxf/mxfdemux.h: * gst/mxf/mxfparse.c: (mxf_random_index_pack_parse): * gst/mxf/mxfparse.h: * gst/mxf/mxftypes.h: Implement parsing of the random index pack, which provides a seek table (including body sid) to the start of partition packs. Later this will be used for reading all index table segments of the complete file efficiently. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfdemux.h mxfparse.c mxfparse.h mxftypes.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3752&r2=1.3753 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3752 retrieving revision 1.3753 diff -u -d -r1.3752 -r1.3753 --- ChangeLog 27 Nov 2008 10:09:51 -0000 1.3752 +++ ChangeLog 27 Nov 2008 16:26:32 -0000 1.3753 @@ -1,5 +1,19 @@ 2008-11-27 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), + (gst_mxf_demux_handle_random_index_pack), + (gst_mxf_demux_pull_random_index_pack), (gst_mxf_demux_loop): + * gst/mxf/mxfdemux.h: + * gst/mxf/mxfparse.c: (mxf_random_index_pack_parse): + * gst/mxf/mxfparse.h: + * gst/mxf/mxftypes.h: + Implement parsing of the random index pack, which provides a seek + table (including body sid) to the start of partition packs. + Later this will be used for reading all index table segments of + the complete file efficiently. + +2008-11-27 Sebastian Dröge <seb...@co...> * gst/mxf/Makefile.am: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_header_metadata_update_streams), Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- mxfdemux.c 27 Nov 2008 10:09:52 -0000 1.11 +++ mxfdemux.c 27 Nov 2008 16:26:38 -0000 1.12 @@ -389,6 +389,11 @@ demux->src = NULL; } + if (demux->partition_index) { + g_array_free (demux->partition_index, TRUE); + demux->partition_index = NULL; + } gst_mxf_demux_reset_mxf_state (demux); gst_mxf_demux_reset_metadata (demux); } @@ -1275,8 +1280,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -2136,7 +2142,17 @@ "Handling random index pack of size %u at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset); - /* TODO: Parse this */ + GST_DEBUG_OBJECT (demux, "Already parsed random index pack"); + return GST_FLOW_OK; + if (!mxf_random_index_pack_parse (key, GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer), &demux->partition_index)) { + GST_ERROR_OBJECT (demux, "Parsing random index pack failed"); + return GST_FLOW_ERROR; return GST_FLOW_OK; @@ -2235,6 +2251,74 @@ return ret; +void +gst_mxf_demux_pull_random_index_pack (GstMXFDemux * demux) +{ + GstBuffer *buffer; + GstFlowReturn ret; + gint64 filesize = -1; + GstFormat fmt = GST_FORMAT_BYTES; + guint32 pack_size; + MXFUL key; + if (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &filesize) || + fmt != GST_FORMAT_BYTES || filesize == -1) { + GST_DEBUG_OBJECT (demux, "Can't query upstream size"); + return; + g_assert (filesize > 4); + if ((ret = + gst_mxf_demux_pull_range (demux, filesize - 4, 4, + &buffer)) != GST_FLOW_OK) { + GST_DEBUG_OBJECT (demux, "Failed pulling last 4 bytes"); + pack_size = GST_READ_UINT32_BE (GST_BUFFER_DATA (buffer)); + gst_buffer_unref (buffer); + if (pack_size < 20) { + GST_DEBUG_OBJECT (demux, "Too small pack size"); + } else if (pack_size > filesize - 20) { + GST_DEBUG_OBJECT (demux, "Too large pack size"); + gst_mxf_demux_pull_range (demux, filesize - pack_size, 16, + GST_DEBUG_OBJECT (demux, "Failed pulling random index pack key"); + memcpy (&key, GST_BUFFER_DATA (buffer), 16); + if (!mxf_is_random_index_pack (&key)) { + GST_DEBUG_OBJECT (demux, "No random index pack"); + gst_mxf_demux_pull_klv_packet (demux, filesize - pack_size, &key, + &buffer, NULL)) != GST_FLOW_OK) { + GST_DEBUG_OBJECT (demux, "Failed pulling random index pack"); + gst_mxf_demux_handle_random_index_pack (demux, &key, buffer); + if (!demux->partition_index) + demux->partition_index = + g_array_new (FALSE, FALSE, sizeof (MXFRandomIndexPackEntry)); +} static void gst_mxf_demux_parse_footer_metadata (GstMXFDemux * demux) { @@ -2521,6 +2605,11 @@ goto pause; + /* First of all pull&parse the random index pack at EOF */ + if (!demux->partition_index) { + gst_mxf_demux_pull_random_index_pack (demux); /* Now actually do something */ ret = gst_mxf_demux_pull_and_handle_klv_packet (demux); Index: mxfdemux.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mxfdemux.h 27 Nov 2008 08:49:08 -0000 1.3 +++ mxfdemux.h 27 Nov 2008 16:26:38 -0000 1.4 @@ -67,6 +67,8 @@ MXFPartitionPack partition; MXFPrimerPack primer; + GArray *partition_index; /* Structural metadata */ gboolean update_metadata; gboolean final_metadata; Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.10 diff -u -d -r1.10 -r1.11 --- mxfparse.c 27 Nov 2008 10:09:53 -0000 1.10 +++ mxfparse.c 27 Nov 2008 16:26:38 -0000 1.11 @@ -556,6 +556,46 @@ memset (pack, 0, sizeof (MXFPartitionPack)); +/* SMPTE 377M 11.1 */ +gboolean +mxf_random_index_pack_parse (const MXFUL * key, const guint8 * data, guint size, + GArray ** array) + guint len, i; + MXFRandomIndexPackEntry entry; + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (array != NULL, FALSE); + if (size < 4) + return FALSE; + if ((size - 4) % 12 != 0) + GST_DEBUG ("Parsing random index pack:"); + len = (size - 4) / 12; + GST_DEBUG (" number of entries = %u", len); + *array = + g_array_sized_new (FALSE, FALSE, sizeof (MXFRandomIndexPackEntry), len); + for (i = 0; i < len; i++) { + entry.body_sid = GST_READ_UINT32_BE (data); + entry.offset = GST_READ_UINT64_BE (data + 4); + data += 12; + GST_DEBUG (" entry %u = body sid %u at offset %" G_GUINT64_FORMAT, i, + entry.body_sid, entry.offset); + g_array_append_val (*array, entry); + return TRUE; /* SMPTE 377M 8.2 Table 1 and 2 */ Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- mxfparse.h 27 Nov 2008 10:09:53 -0000 1.7 +++ mxfparse.h 27 Nov 2008 16:26:39 -0000 1.8 @@ -77,6 +77,8 @@ gboolean mxf_primer_pack_parse (const MXFUL *key, MXFPrimerPack *pack, const guint8 *data, guint size); void mxf_primer_pack_reset (MXFPrimerPack *pack); +gboolean mxf_random_index_pack_parse (const MXFUL *key, const guint8 *data, guint size, GArray **array); gboolean mxf_local_tag_parse (const guint8 * data, guint size, guint16 * tag, guint16 * tag_size, const guint8 ** tag_data); void gst_mxf_local_tag_free (MXFLocalTag *tag); Index: mxftypes.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h,v retrieving revision 1.2 diff -u -d -r1.2 -r1.3 --- mxftypes.h 25 Nov 2008 10:26:11 -0000 1.2 +++ mxftypes.h 27 Nov 2008 16:26:39 -0000 1.3 @@ -63,6 +63,12 @@ guint8 *data; } MXFLocalTag; +typedef struct { + guint32 body_sid; + guint64 offset; +} MXFRandomIndexPackEntry; typedef enum { MXF_PARTITION_PACK_HEADER, MXF_PARTITION_PACK_BODY, |
From: <sl...@ke...> - 2008-11-28 11:25:10
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Fri Nov 28 2008 11:24:38 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), (gst_mxf_demux_handle_index_table_segment): * gst/mxf/mxfdemux.h: * gst/mxf/mxfparse.c: (mxf_index_table_segment_parse), (mxf_index_table_segment_reset): * gst/mxf/mxfparse.h: * gst/mxf/mxftypes.h: Implement parsing of index table segments, which will later be used for seeking. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfdemux.h mxfparse.c mxfparse.h mxftypes.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3760&r2=1.3761 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3760 retrieving revision 1.3761 diff -u -d -r1.3760 -r1.3761 --- ChangeLog 28 Nov 2008 09:49:53 -0000 1.3760 +++ ChangeLog 28 Nov 2008 11:24:22 -0000 1.3761 @@ -1,5 +1,17 @@ 2008-11-28 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), + (gst_mxf_demux_handle_index_table_segment): + * gst/mxf/mxfdemux.h: + * gst/mxf/mxfparse.c: (mxf_index_table_segment_parse), + (mxf_index_table_segment_reset): + * gst/mxf/mxfparse.h: + * gst/mxf/mxftypes.h: + Implement parsing of index table segments, which will later be + used for seeking. + +2008-11-28 Sebastian Dröge <seb...@co...> * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- mxfdemux.c 27 Nov 2008 16:26:38 -0000 1.12 +++ mxfdemux.c 28 Nov 2008 11:24:23 -0000 1.13 @@ -394,6 +394,17 @@ demux->partition_index = NULL; } + if (demux->index_table) { + guint i; + for (i = 0; i < demux->index_table->len; i++) + mxf_index_table_segment_reset (&g_array_index (demux->index_table, + MXFIndexTableSegment, i)); + g_array_free (demux->index_table, TRUE); + demux->index_table = NULL; + } gst_mxf_demux_reset_mxf_state (demux); gst_mxf_demux_reset_metadata (demux); } @@ -1280,9 +1291,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -2160,11 +2170,32 @@ gst_mxf_demux_handle_index_table_segment (GstMXFDemux * demux, const MXFUL * key, GstBuffer * buffer) { + MXFIndexTableSegment segment; + memset (&segment, 0, sizeof (segment)); GST_DEBUG_OBJECT (demux, "Handling index table segment of size %u at offset %" G_GUINT64_FORMAT, GST_BUFFER_SIZE (buffer), demux->offset); - /* TODO: Parse this */ + if (!demux->primer.valid) { + GST_WARNING_OBJECT (demux, "Invalid primer pack"); + return GST_FLOW_OK; + if (!mxf_index_table_segment_parse (key, &segment, &demux->primer, + GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer))) { + GST_ERROR_OBJECT (demux, "Parsing index table segment failed"); + return GST_FLOW_ERROR; + if (!demux->index_table) + demux->index_table = + g_array_new (FALSE, FALSE, sizeof (MXFIndexTableSegment)); + g_array_append_val (demux->index_table, segment); return GST_FLOW_OK; Index: mxfdemux.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mxfdemux.h 27 Nov 2008 16:26:38 -0000 1.4 +++ mxfdemux.h 28 Nov 2008 11:24:23 -0000 1.5 @@ -68,6 +68,7 @@ MXFPrimerPack primer; GArray *partition_index; + GArray *index_table; /* Structural metadata */ gboolean update_metadata; Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.11 diff -u -d -r1.11 -r1.12 --- mxfparse.c 27 Nov 2008 16:26:38 -0000 1.11 +++ mxfparse.c 28 Nov 2008 11:24:23 -0000 1.12 @@ -596,6 +596,246 @@ return TRUE; +/* SMPTE 377M 10.2.3 */ +gboolean +mxf_index_table_segment_parse (const MXFUL * key, + MXFIndexTableSegment * segment, const MXFPrimerPack * primer, + const guint8 * data, guint size) +{ + gchar str[48]; + guint16 tag, tag_size; + const guint8 *tag_data; + g_return_val_if_fail (key != NULL, FALSE); + g_return_val_if_fail (data != NULL, FALSE); + g_return_val_if_fail (primer != NULL, FALSE); + memset (segment, 0, sizeof (MXFIndexTableSegment)); + if (size < 70) + return FALSE; + GST_DEBUG ("Parsing index table segment:"); + while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) { + if (tag_size == 0 || tag == 0x0000) + goto next; + switch (tag) { + case 0x3c0a: + if (tag_size != 16) + goto error; + memcpy (&segment->instance_id, tag_data, 16); + GST_DEBUG (" instance id = %s", + mxf_ul_to_string (&segment->instance_id, str)); + break; + case 0x3f0b: + if (!mxf_fraction_parse (&segment->index_edit_rate, tag_data, tag_size)) + GST_DEBUG (" index edit rate = %d/%d", segment->index_edit_rate.n, + segment->index_edit_rate.d); + case 0x3f0c: + if (tag_size != 8) + segment->index_start_position = GST_READ_UINT64_BE (tag_data); + GST_DEBUG (" index start position = %" G_GINT64_FORMAT, + segment->index_start_position); + case 0x3f0d: + segment->index_duration = GST_READ_UINT64_BE (tag_data); + GST_DEBUG (" index duration = %" G_GINT64_FORMAT, + segment->index_duration); + case 0x3f05: + if (tag_size != 4) + segment->edit_unit_byte_count = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" edit unit byte count = %u", + segment->edit_unit_byte_count); + case 0x3f06: + segment->index_sid = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" index sid = %u", segment->index_sid); + case 0x3f07: + segment->body_sid = GST_READ_UINT32_BE (tag_data); + GST_DEBUG (" body sid = %u", segment->body_sid); + case 0x3f08: + if (tag_size != 1) + segment->slice_count = GST_READ_UINT8 (tag_data); + GST_DEBUG (" slice count = %u", segment->slice_count); + case 0x3f0e: + segment->pos_table_count = GST_READ_UINT8 (tag_data); + GST_DEBUG (" pos table count = %u", segment->pos_table_count); + case 0x3f09:{ + guint len, i; + if (tag_size < 8) + len = GST_READ_UINT32_BE (tag_data); + segment->n_delta_entries = len; + GST_DEBUG (" number of delta entries = %u", segment->n_delta_entries); + if (len == 0) + goto next; + tag_data += 4; + tag_size -= 4; + if (GST_READ_UINT32_BE (tag_data) != 6) + if (tag_size < len * 6) + segment->delta_entries = g_new (MXFDeltaEntry, len); + for (i = 0; i < len; i++) { + GST_DEBUG (" delta entry %u:", i); + segment->delta_entries[i].pos_table_index = GST_READ_UINT8 (tag_data); + tag_data += 1; + tag_size -= 1; + GST_DEBUG (" pos table index = %d", + segment->delta_entries[i].pos_table_index); + segment->delta_entries[i].slice = GST_READ_UINT8 (tag_data); + GST_DEBUG (" slice = %u", segment->delta_entries[i].slice); + segment->delta_entries[i].element_delta = + GST_READ_UINT32_BE (tag_data); + tag_data += 4; + tag_size -= 4; + GST_DEBUG (" element delta = %u", + segment->delta_entries[i].element_delta); + } + } + case 0x3f0a:{ + guint len, i, j; + segment->n_index_entries = len; + GST_DEBUG (" number of index entries = %u", segment->n_index_entries); + if (GST_READ_UINT32_BE (tag_data) != + (11 + 4 * segment->slice_count + 8 * segment->pos_table_count)) + if (tag_size < + len * (11 + 4 * segment->slice_count + + 8 * segment->pos_table_count)) + segment->index_entries = g_new (MXFIndexEntry, len); + MXFIndexEntry *entry = &segment->index_entries[i]; + GST_DEBUG (" index entry %u:", i); + entry->temporal_offset = GST_READ_UINT8 (tag_data); + GST_DEBUG (" temporal offset = %d", entry->temporal_offset); + entry->key_frame_offset = GST_READ_UINT8 (tag_data); + GST_DEBUG (" keyframe offset = %d", entry->key_frame_offset); + entry->flags = GST_READ_UINT8 (tag_data); + GST_DEBUG (" flags = 0x%02x", entry->flags); + entry->stream_offset = GST_READ_UINT64_BE (tag_data); + tag_data += 8; + tag_size -= 8; + GST_DEBUG (" stream offset = %" G_GUINT64_FORMAT, + entry->stream_offset); + for (j = 0; j < segment->slice_count; j++) { + entry->slice_offset[j] = GST_READ_UINT32_BE (tag_data); + tag_data += 4; + tag_size -= 4; + GST_DEBUG (" slice %u offset = %u", j, entry->slice_offset[j]); + } + for (j = 0; j < segment->pos_table_count; j++) { + mxf_fraction_parse (&entry->pos_table[j], tag_data, tag_size); + tag_data += 8; + tag_size -= 8; + GST_DEBUG (" pos table %u = %d/%d", j, entry->pos_table[j].n, + entry->pos_table[j].d); + default: + if (!gst_metadata_add_custom_tag (primer, tag, tag_data, tag_size, + &segment->other_tags)) + } + next: + data += 4 + tag_size; + size -= 4 + tag_size; + return TRUE; +error: + GST_ERROR ("Invalid index table segment"); + return FALSE; +} +void +mxf_index_table_segment_reset (MXFIndexTableSegment * segment) + guint i; + g_return_if_fail (segment != NULL); + for (i = 0; i < segment->n_index_entries; i++) { + g_free (segment->index_entries[i].slice_offset); + g_free (segment->index_entries[i].pos_table); + g_free (segment->index_entries); + g_free (segment->delta_entries); + if (segment->other_tags) + g_hash_table_destroy (segment->other_tags); /* SMPTE 377M 8.2 Table 1 and 2 */ static void Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- mxfparse.h 27 Nov 2008 16:26:39 -0000 1.8 +++ mxfparse.h 28 Nov 2008 11:24:24 -0000 1.9 @@ -79,6 +79,9 @@ gboolean mxf_random_index_pack_parse (const MXFUL *key, const guint8 *data, guint size, GArray **array); +gboolean mxf_index_table_segment_parse (const MXFUL *key, MXFIndexTableSegment *segment, const MXFPrimerPack *primer, const guint8 *data, guint size); +void mxf_index_table_segment_reset (MXFIndexTableSegment *segment); gboolean mxf_local_tag_parse (const guint8 * data, guint size, guint16 * tag, guint16 * tag_size, const guint8 ** tag_data); void gst_mxf_local_tag_free (MXFLocalTag *tag); Index: mxftypes.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxftypes.h,v retrieving revision 1.3 diff -u -d -r1.3 -r1.4 --- mxftypes.h 27 Nov 2008 16:26:39 -0000 1.3 +++ mxftypes.h 28 Nov 2008 11:24:24 -0000 1.4 @@ -115,6 +115,44 @@ GHashTable *mappings; } MXFPrimerPack; +typedef struct { + gint8 pos_table_index; + guint8 slice; + guint32 element_delta; +} MXFDeltaEntry; + gint8 temporal_offset; + gint8 key_frame_offset; + guint8 flags; + guint64 stream_offset; + + guint32 *slice_offset; + MXFFraction *pos_table; +} MXFIndexEntry; + MXFUL instance_id; + MXFFraction index_edit_rate; + gint64 index_start_position; + gint64 index_duration; + guint32 edit_unit_byte_count; + guint32 index_sid; + guint32 body_sid; + guint8 slice_count; + guint8 pos_table_count; + guint32 n_delta_entries; + MXFDeltaEntry *delta_entries; + guint32 n_index_entries; + MXFIndexEntry *index_entries; + GHashTable *other_tags; +} MXFIndexTableSegment; /* SMPTE 377M 8.6 table 14 */ #define MXF_METADATA_PREFACE (0x012f) #define MXF_METADATA_IDENTIFICATION (0x0130) |
From: <sl...@ke...> - 2008-11-28 18:13:49
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Fri Nov 28 2008 18:13:44 UTC Log message: * gst/mxf/Makefile.am: * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps): * gst/mxf/mxfalaw.c: (mxf_is_alaw_audio_essence_track), (mxf_alaw_handle_essence_element), (mxf_alaw_create_caps): * gst/mxf/mxfalaw.h: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_header_metadata_update_streams): Add support for A-Law encoded audio essence (SMPTE 388M and 382M). Modified files: . : ChangeLog gst/mxf : Makefile.am mxfaes-bwf.c mxfdemux.c Added files: gst/mxf : mxfalaw.c mxfalaw.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3761&r2=1.3762 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/Makefile.am.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3761 retrieving revision 1.3762 diff -u -d -r1.3761 -r1.3762 --- ChangeLog 28 Nov 2008 11:24:22 -0000 1.3761 +++ ChangeLog 28 Nov 2008 18:13:27 -0000 1.3762 @@ -1,5 +1,16 @@ 2008-11-28 Sebastian Dröge <seb...@co...> + * gst/mxf/Makefile.am: + * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps): + * gst/mxf/mxfalaw.c: (mxf_is_alaw_audio_essence_track), + (mxf_alaw_handle_essence_element), (mxf_alaw_create_caps): + * gst/mxf/mxfalaw.h: + * gst/mxf/mxfdemux.c: + (gst_mxf_demux_handle_header_metadata_update_streams): + Add support for A-Law encoded audio essence (SMPTE 388M and 382M). + +2008-11-28 Sebastian Dröge <seb...@co...> * gst/mxf/mxfdemux.c: (gst_mxf_demux_reset), (gst_mxf_demux_handle_index_table_segment): * gst/mxf/mxfdemux.h: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile.am 27 Nov 2008 10:09:52 -0000 1.2 +++ Makefile.am 28 Nov 2008 18:13:29 -0000 1.3 @@ -6,7 +6,8 @@ mxfparse.c \ mxfaes-bwf.c \ mxfmpeg.c \ - mxfdv-dif.c + mxfdv-dif.c \ + mxfalaw.c libgstmxf_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstmxf_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) @@ -18,5 +19,6 @@ mxfaes-bwf.h \ mxfmpeg.h \ mxfdv-dif.h \ + mxfalaw.h \ mxftypes.h Index: mxfaes-bwf.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- mxfaes-bwf.c 26 Nov 2008 10:37:33 -0000 1.4 +++ mxfaes-bwf.c 28 Nov 2008 18:13:29 -0000 1.5 @@ -244,6 +244,11 @@ 0x7E, 0x00, 0x00, 0x00} }; +static const MXFUL mxf_sound_essence_compression_alaw = + { {0x06, 0x0E, 0x2B, 0x34, 0x04, 0x01, 0x01, 0x03, 0x04, 0x02, 0x02, 0x02, + 0x03, 0x01, 0x01, 0x00} +}; static GstCaps * mxf_bwf_create_caps (MXFMetadataGenericPackage * package, MXFMetadataTrack * track, @@ -313,6 +318,19 @@ (block_align != 1), "endianness", G_TYPE_INT, G_BIG_ENDIAN, "depth", G_TYPE_INT, (block_align / descriptor->channel_count) * 8, "width", G_TYPE_INT, (block_align / descriptor->channel_count) * 8, NULL); + } else if (mxf_ul_is_equal (&descriptor->sound_essence_compression, + &mxf_sound_essence_compression_alaw)) { + if (descriptor->audio_sampling_rate.n != 0 || + descriptor->audio_sampling_rate.d != 0 || + descriptor->channel_count != 0) { + GST_ERROR ("Invalid descriptor"); + return NULL; + } + ret = gst_caps_new_simple ("audio/x-alaw", "rate", G_TYPE_INT, + (gint) (((gdouble) descriptor->audio_sampling_rate.n) / + ((gdouble) descriptor->audio_sampling_rate.d) + 0.5), + "channels", G_TYPE_INT, descriptor->channel_count); } else { GST_ERROR ("Unsupported sound essence compression: %s", mxf_ul_to_string (&descriptor->sound_essence_compression, str)); --- NEW FILE: mxfalaw.c --- /* GStreamer * Copyright (C) 2008 Sebastian Dröge <seb...@co...> * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Implementation of SMPTE 388M - Mapping A-Law coded audio into the MXF * Generic Container #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <gst/gst.h> #include <string.h> #include "mxfalaw.h" GST_DEBUG_CATEGORY_EXTERN (mxf_debug); #define GST_CAT_DEFAULT mxf_debug gboolean mxf_is_alaw_audio_essence_track (const MXFMetadataTrack * track) { guint i; g_return_val_if_fail (track != NULL, FALSE); if (track->descriptor == NULL) return FALSE; for (i = 0; i < track->n_descriptor; i++) { MXFMetadataFileDescriptor *d = track->descriptor[i]; MXFUL *key = &d->essence_container; /* SMPTE 388M 6.1 */ if (mxf_is_generic_container_essence_container_label (key) && key->u[12] == 0x02 && key->u[13] == 0x0a && (key->u[14] == 0x01 || key->u[14] == 0x02 || key->u[14] == 0x03)) return TRUE; } return FALSE; } static GstFlowReturn mxf_alaw_handle_essence_element (const MXFUL * key, GstBuffer * buffer, GstCaps * caps, MXFMetadataGenericPackage * package, MXFMetadataTrack * track, MXFMetadataStructuralComponent * component, gpointer mapping_data, GstBuffer ** outbuf) *outbuf = buffer; /* SMPTE 388M 5.1 */ if (key->u[12] != 0x16 || (key->u[14] != 0x08 && key->u[14] != 0x09 && key->u[14] != 0x0a)) { GST_ERROR ("Invalid A-Law essence element"); return GST_FLOW_ERROR; return GST_FLOW_OK; GstCaps * mxf_alaw_create_caps (MXFMetadataGenericPackage * package, MXFMetadataTrack * track, GstTagList ** tags, MXFEssenceElementHandler * handler, gpointer * mapping_data) MXFMetadataFileDescriptor *f = NULL; MXFMetadataGenericSoundEssenceDescriptor *s = NULL; GstCaps *caps = NULL; g_return_val_if_fail (package != NULL, NULL); g_return_val_if_fail (track != NULL, NULL); if (track->descriptor == NULL) { GST_ERROR ("No descriptor found for this track"); return NULL; if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR) { s = (MXFMetadataGenericSoundEssenceDescriptor *) track->descriptor[i]; f = track->descriptor[i]; break; } else if (((MXFMetadataGenericDescriptor *) track-> descriptor[i])->is_file_descriptor && ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type != MXF_METADATA_MULTIPLE_DESCRIPTOR) { } if (!f) { *handler = mxf_alaw_handle_essence_element; caps = gst_caps_new_simple ("audio/x-alaw", NULL); if (s) { if (s->audio_sampling_rate.n != 0 && s->audio_sampling_rate.d != 0) gst_caps_set_simple (caps, "rate", G_TYPE_INT, (gint) (((gdouble) s->audio_sampling_rate.n) / ((gdouble) s->audio_sampling_rate.d) + 0.5), NULL); if (s->channel_count != 0) gst_caps_set_simple (caps, "channels", G_TYPE_INT, s->channel_count, NULL); /* TODO: Handle channel layout somehow? */ } else { GST_WARNING ("Only a generic sound essence descriptor found"); return caps; --- NEW FILE: mxfalaw.h --- #ifndef __MXF_ALAW_H__ #define __MXF_ALAW_H__ #include "mxfparse.h" gboolean mxf_is_alaw_audio_essence_track (const MXFMetadataTrack *track); mxf_alaw_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); #endif /* __MXF_ALAW_H__ */ Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- mxfdemux.c 28 Nov 2008 11:24:23 -0000 1.13 +++ mxfdemux.c 28 Nov 2008 18:13:30 -0000 1.14 @@ -34,6 +34,7 @@ #include "mxfaes-bwf.h" #include "mxfmpeg.h" #include "mxfdv-dif.h" +#include "mxfalaw.h" #include <string.h> @@ -1291,8 +1292,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1842,6 +1844,10 @@ caps = mxf_dv_dif_create_caps (source_package, source_track, &pad->tags, &pad->handle_essence_element, &pad->mapping_data); + else if (mxf_is_alaw_audio_essence_track (source_track)) + caps = + mxf_alaw_create_caps (source_package, source_track, + &pad->tags, &pad->handle_essence_element, &pad->mapping_data); break; case MXF_METADATA_TRACK_DATA_ESSENCE: if (mxf_is_dv_dif_essence_track (source_track)) |
From: <sl...@ke...> - 2008-11-28 18:55:20
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Fri Nov 28 2008 18:55:15 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_random_index_pack): Only try to pull the random index pack at the end of file one time and not for every single packet if it fails. Modified files: . : ChangeLog gst/mxf : mxfdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3762&r2=1.3763 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3762 retrieving revision 1.3763 diff -u -d -r1.3762 -r1.3763 --- ChangeLog 28 Nov 2008 18:13:27 -0000 1.3762 +++ ChangeLog 28 Nov 2008 18:55:00 -0000 1.3763 @@ -1,5 +1,11 @@ 2008-11-28 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_random_index_pack): + Only try to pull the random index pack at the end of file one time + and not for every single packet if it fails. + +2008-11-28 Sebastian Dröge <seb...@co...> * gst/mxf/Makefile.am: * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps): * gst/mxf/mxfalaw.c: (mxf_is_alaw_audio_essence_track), Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- mxfdemux.c 28 Nov 2008 18:13:30 -0000 1.14 +++ mxfdemux.c 28 Nov 2008 18:55:01 -0000 1.15 @@ -1292,9 +1292,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -2301,7 +2300,7 @@ if (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &filesize) || fmt != GST_FORMAT_BYTES || filesize == -1) { GST_DEBUG_OBJECT (demux, "Can't query upstream size"); - return; + goto out; } g_assert (filesize > 4); @@ -2310,7 +2309,7 @@ gst_mxf_demux_pull_range (demux, filesize - 4, 4, &buffer)) != GST_FLOW_OK) { GST_DEBUG_OBJECT (demux, "Failed pulling last 4 bytes"); pack_size = GST_READ_UINT32_BE (GST_BUFFER_DATA (buffer)); @@ -2319,17 +2318,17 @@ if (pack_size < 20) { GST_DEBUG_OBJECT (demux, "Too small pack size"); } else if (pack_size > filesize - 20) { GST_DEBUG_OBJECT (demux, "Too large pack size"); if ((ret = gst_mxf_demux_pull_range (demux, filesize - pack_size, 16, GST_DEBUG_OBJECT (demux, "Failed pulling random index pack key"); memcpy (&key, GST_BUFFER_DATA (buffer), 16); @@ -2337,20 +2336,21 @@ if (!mxf_is_random_index_pack (&key)) { GST_DEBUG_OBJECT (demux, "No random index pack"); gst_mxf_demux_pull_klv_packet (demux, filesize - pack_size, &key, &buffer, NULL)) != GST_FLOW_OK) { GST_DEBUG_OBJECT (demux, "Failed pulling random index pack"); gst_mxf_demux_handle_random_index_pack (demux, &key, buffer); gst_buffer_unref (buffer); +out: if (!demux->partition_index) demux->partition_index = g_array_new (FALSE, FALSE, sizeof (MXFRandomIndexPackEntry)); |
From: <sl...@ke...> - 2008-11-29 20:25:25
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sat Nov 29 2008 20:25:20 UTC Log message: * gst/mxf/Makefile.am: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_header_metadata_update_streams): * gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_video_essence_track), (mxf_jpeg2000_handle_essence_element), (mxf_jpeg2000_create_caps): * gst/mxf/mxfjpeg2000.h: Add initial support for JPEG2000 encoded video essence. * gst/mxf/mxfparse.c: (mxf_metadata_generic_picture_essence_descriptor_set_caps): Set the framerate in the video caps. Modified files: . : ChangeLog gst/mxf : Makefile.am mxfdemux.c mxfparse.c Added files: gst/mxf : mxfjpeg2000.c mxfjpeg2000.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3765&r2=1.3766 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/Makefile.am.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3765 retrieving revision 1.3766 diff -u -d -r1.3765 -r1.3766 --- ChangeLog 29 Nov 2008 20:07:10 -0000 1.3765 +++ ChangeLog 29 Nov 2008 20:25:04 -0000 1.3766 @@ -1,5 +1,19 @@ 2008-11-29 Sebastian Dröge <seb...@co...> + * gst/mxf/Makefile.am: + * gst/mxf/mxfdemux.c: + (gst_mxf_demux_handle_header_metadata_update_streams): + * gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_video_essence_track), + (mxf_jpeg2000_handle_essence_element), (mxf_jpeg2000_create_caps): + * gst/mxf/mxfjpeg2000.h: + Add initial support for JPEG2000 encoded video essence. + + * gst/mxf/mxfparse.c: + (mxf_metadata_generic_picture_essence_descriptor_set_caps): + Set the framerate in the video caps. +2008-11-29 Sebastian Dröge <seb...@co...> * ext/jp2k/gstjasperdec.c: (gst_jasper_dec_sink_setcaps): Don't unref the element instance if we don't own a reference. Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/Makefile.am,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- Makefile.am 28 Nov 2008 18:13:29 -0000 1.3 +++ Makefile.am 29 Nov 2008 20:25:05 -0000 1.4 @@ -7,7 +7,8 @@ mxfaes-bwf.c \ mxfmpeg.c \ mxfdv-dif.c \ - mxfalaw.c + mxfalaw.c \ + mxfjpeg2000.c libgstmxf_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) libgstmxf_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) @@ -20,5 +21,6 @@ mxfmpeg.h \ mxfdv-dif.h \ mxfalaw.h \ + mxfjpeg2000.h \ mxftypes.h Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- mxfdemux.c 28 Nov 2008 18:55:01 -0000 1.15 +++ mxfdemux.c 29 Nov 2008 20:25:05 -0000 1.16 @@ -19,7 +19,7 @@ /* TODO: * - start at correct position of the component, switch components - * - RandomIndex / IndexSegment support + * - seeking support * - timecode tracks * - descriptive metadata * - generic container system items @@ -35,6 +35,7 @@ #include "mxfmpeg.h" #include "mxfdv-dif.h" #include "mxfalaw.h" +#include "mxfjpeg2000.h" #include <string.h> @@ -1292,8 +1293,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1833,6 +1835,10 @@ caps = mxf_dv_dif_create_caps (source_package, source_track, &pad->tags, &pad->handle_essence_element, &pad->mapping_data); + else if (mxf_is_jpeg2000_video_essence_track (source_track)) + caps = + mxf_jpeg2000_create_caps (source_package, source_track, + &pad->tags, &pad->handle_essence_element, &pad->mapping_data); break; case MXF_METADATA_TRACK_SOUND_ESSENCE: if (mxf_is_aes_bwf_essence_track (source_track)) --- NEW FILE: mxfjpeg2000.c --- /* GStreamer * Copyright (C) 2008 Sebastian Dröge <seb...@co...> * * 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., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* Implementation of SMPTE 422M - Mapping JPEG2000 codestreams into the MXF * Generic Container /* TODO: * - parse the jpeg2000 sub-descriptor, see SMPTE 422M 7.2 #ifdef HAVE_CONFIG_H #include "config.h" #endif #include <gst/gst.h> #include <string.h> #include "mxfjpeg2000.h" GST_DEBUG_CATEGORY_EXTERN (mxf_debug); #define GST_CAT_DEFAULT mxf_debug gboolean mxf_is_jpeg2000_video_essence_track (const MXFMetadataTrack * track) { guint i; g_return_val_if_fail (track != NULL, FALSE); if (track->descriptor == NULL) return FALSE; for (i = 0; i < track->n_descriptor; i++) { MXFMetadataFileDescriptor *d = track->descriptor[i]; MXFUL *key = &d->essence_container; /* SMPTE 422M 5.4 */ if (mxf_is_generic_container_essence_container_label (key) && key->u[12] == 0x02 && key->u[13] == 0x0c && (key->u[14] == 0x01 || key->u[14] == 0x02)) return TRUE; } return FALSE; } static GstFlowReturn mxf_jpeg2000_handle_essence_element (const MXFUL * key, GstBuffer * buffer, GstCaps * caps, MXFMetadataGenericPackage * package, MXFMetadataTrack * track, MXFMetadataStructuralComponent * component, gpointer mapping_data, GstBuffer ** outbuf) *outbuf = buffer; /* SMPTE 422M 5.1 */ if (key->u[12] != 0x15 || (key->u[14] != 0x08 && key->u[14] != 0x09)) { GST_ERROR ("Invalid JPEG2000 essence element"); return GST_FLOW_ERROR; return GST_FLOW_OK; GstCaps * mxf_jpeg2000_create_caps (MXFMetadataGenericPackage * package, MXFMetadataTrack * track, GstTagList ** tags, MXFEssenceElementHandler * handler, gpointer * mapping_data) MXFMetadataFileDescriptor *f = NULL; MXFMetadataGenericPictureEssenceDescriptor *p = NULL; GstCaps *caps = NULL; g_return_val_if_fail (package != NULL, NULL); g_return_val_if_fail (track != NULL, NULL); if (track->descriptor == NULL) { GST_ERROR ("No descriptor found for this track"); return NULL; if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == MXF_METADATA_GENERIC_PICTURE_ESSENCE_DESCRIPTOR || ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == MXF_METADATA_RGBA_PICTURE_ESSENCE_DESCRIPTOR || MXF_METADATA_CDCI_PICTURE_ESSENCE_DESCRIPTOR) { p = (MXFMetadataGenericPictureEssenceDescriptor *) track->descriptor[i]; f = track->descriptor[i]; break; } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])-> is_file_descriptor && ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type != MXF_METADATA_MULTIPLE_DESCRIPTOR) { } if (!f) { *handler = mxf_jpeg2000_handle_essence_element; caps = gst_caps_new_simple ("image/jp2", NULL); if (p) { mxf_metadata_generic_picture_essence_descriptor_set_caps (p, caps); } else { GST_WARNING ("Only a generic file descriptor found"); return caps; --- NEW FILE: mxfjpeg2000.h --- #ifndef __MXF_JPEG2000_H__ #define __MXF_JPEG2000_H__ #include "mxfparse.h" gboolean mxf_is_jpeg2000_video_essence_track (const MXFMetadataTrack *track); mxf_jpeg2000_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); #endif /* __MXF_JPEG2000_H__ */ Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- mxfparse.c 28 Nov 2008 11:24:23 -0000 1.12 +++ mxfparse.c 29 Nov 2008 20:25:06 -0000 1.13 @@ -2582,10 +2582,14 @@ { guint par_n, par_d; guint width, height; + MXFMetadataFileDescriptor *f = (MXFMetadataFileDescriptor *) descriptor; g_return_if_fail (descriptor != NULL); g_return_if_fail (GST_IS_CAPS (caps)); + gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, f->sample_rate.n, + f->sample_rate.d, NULL); width = descriptor->stored_width; height = descriptor->stored_height; |
From: <sl...@ke...> - 2008-11-30 14:12:25
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sun Nov 30 2008 14:12:18 UTC Log message: * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_create_caps): Set the correct MPEG video version if possible and add support for MPEG4 video, including codec_data. Modified files: . : ChangeLog gst/mxf : mxfjpeg2000.c mxfmpeg.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3766&r2=1.3767 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3766 retrieving revision 1.3767 diff -u -d -r1.3766 -r1.3767 --- ChangeLog 29 Nov 2008 20:25:04 -0000 1.3766 +++ ChangeLog 30 Nov 2008 14:12:02 -0000 1.3767 @@ -1,3 +1,10 @@ +2008-11-30 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): + * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_create_caps): + Set the correct MPEG video version if possible and add support + for MPEG4 video, including codec_data. 2008-11-29 Sebastian Dröge <seb...@co...> * gst/mxf/Makefile.am: Index: mxfjpeg2000.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mxfjpeg2000.c 29 Nov 2008 20:25:05 -0000 1.1 +++ mxfjpeg2000.c 30 Nov 2008 14:12:04 -0000 1.2 @@ -106,8 +106,8 @@ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->descriptor[i]; f = track->descriptor[i]; break; - } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])-> - is_file_descriptor + } else if (((MXFMetadataGenericDescriptor *) track-> + descriptor[i])->is_file_descriptor && ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type != MXF_METADATA_MULTIPLE_DESCRIPTOR) { @@ -121,7 +121,8 @@ *handler = mxf_jpeg2000_handle_essence_element; - caps = gst_caps_new_simple ("image/jp2", NULL); + /* TODO: What about other field values? */ + caps = gst_caps_new_simple ("image/x-j2c", "fields", G_TYPE_INT, 1, NULL); if (p) { mxf_metadata_generic_picture_essence_descriptor_set_caps (p, caps); } else { Index: mxfmpeg.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- mxfmpeg.c 26 Nov 2008 10:37:33 -0000 1.5 +++ mxfmpeg.c 30 Nov 2008 14:12:04 -0000 1.6 @@ -236,6 +236,12 @@ return GST_FLOW_OK; } +/* Private uid used by SONY C0023S01.mxf, + * taken from the ffmpeg mxf demuxer */ +static const guint8 sony_mpeg4_extradata[] = { + 0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x01, 0x0e, 0x06, 0x06, 0x02, 0x02, + 0x01, 0x00, 0x00 +}; GstCaps * mxf_mpeg_video_create_caps (MXFMetadataGenericPackage * package, @@ -284,10 +290,59 @@ *handler = mxf_mpeg_video_handle_essence_element; /* SMPTE 381M 7 */ if (f->essence_container.u[13] == 0x04) { - /* FIXME: get mpeg version somehow */ GST_DEBUG ("Found MPEG ES stream"); - caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, - "systemstream", G_TYPE_BOOLEAN, FALSE, 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, + } else if (p->picture_essence_coding.u[13] == 0x10) { + caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, + } 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, + 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]); + } } else if (f->essence_container.u[13] == 0x07) { GST_ERROR ("MPEG PES streams not supported yet"); return NULL; |
From: <sl...@ke...> - 2008-11-30 16:22:02
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sun Nov 30 2008 16:21:56 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_random_index_pack): Make sure that demux->offset has the correct value before calling any gst_mxf_demux_handle_* functions. Modified files: . : ChangeLog gst/mxf : mxfdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3767&r2=1.3768 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.16&r2=1.17 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3767 retrieving revision 1.3768 diff -u -d -r1.3767 -r1.3768 --- ChangeLog 30 Nov 2008 14:12:02 -0000 1.3767 +++ ChangeLog 30 Nov 2008 16:21:40 -0000 1.3768 @@ -1,5 +1,11 @@ 2008-11-30 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_random_index_pack): + Make sure that demux->offset has the correct value before + calling any gst_mxf_demux_handle_* functions. + +2008-11-30 Sebastian Dröge <seb...@co...> * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): * gst/mxf/mxfmpeg.c: (mxf_mpeg_video_create_caps): Set the correct MPEG video version if possible and add support Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- mxfdemux.c 29 Nov 2008 20:25:05 -0000 1.16 +++ mxfdemux.c 30 Nov 2008 16:21:42 -0000 1.17 @@ -1293,9 +1293,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -2301,6 +2300,7 @@ gint64 filesize = -1; GstFormat fmt = GST_FORMAT_BYTES; guint32 pack_size; + guint64 old_offset = demux->offset; MXFUL key; if (!gst_pad_query_peer_duration (demux->sinkpad, &fmt, &filesize) || @@ -2323,10 +2323,10 @@ gst_buffer_unref (buffer); if (pack_size < 20) { - GST_DEBUG_OBJECT (demux, "Too small pack size"); + GST_DEBUG_OBJECT (demux, "Too small pack size (%u bytes)", pack_size); goto out; } else if (pack_size > filesize - 20) { - GST_DEBUG_OBJECT (demux, "Too large pack size"); + GST_DEBUG_OBJECT (demux, "Too large pack size (%u bytes)", pack_size); } @@ -2345,6 +2345,7 @@ + demux->offset = filesize - pack_size; if ((ret = gst_mxf_demux_pull_klv_packet (demux, filesize - pack_size, &key, &buffer, NULL)) != GST_FLOW_OK) { @@ -2352,9 +2353,9 @@ - gst_mxf_demux_handle_random_index_pack (demux, &key, buffer); + demux->offset = old_offset; out: if (!demux->partition_index) |
From: <sl...@ke...> - 2008-11-30 17:27:13
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sun Nov 30 2008 17:27:09 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_remove_pads), (gst_mxf_demux_reset), (gst_mxf_demux_find_package), (gst_mxf_demux_choose_package), (gst_mxf_demux_handle_header_metadata_update_streams), (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_set_property), (gst_mxf_demux_get_property), (gst_mxf_demux_finalize), (gst_mxf_demux_class_init): * gst/mxf/mxfdemux.h: * gst/mxf/mxfparse.c: (mxf_umid_from_string): * gst/mxf/mxfparse.h: Add property to select the top-level source package or material package that should be used for playback. Modified files: . : ChangeLog gst/mxf : mxfdemux.c mxfdemux.h mxfparse.c mxfparse.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3768&r2=1.3769 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3768 retrieving revision 1.3769 diff -u -d -r1.3768 -r1.3769 --- ChangeLog 30 Nov 2008 16:21:40 -0000 1.3768 +++ ChangeLog 30 Nov 2008 17:26:53 -0000 1.3769 @@ -1,5 +1,20 @@ 2008-11-30 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: (gst_mxf_demux_remove_pads), + (gst_mxf_demux_reset), (gst_mxf_demux_find_package), + (gst_mxf_demux_choose_package), + (gst_mxf_demux_handle_header_metadata_update_streams), + (gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_set_property), + (gst_mxf_demux_get_property), (gst_mxf_demux_finalize), + (gst_mxf_demux_class_init): + * gst/mxf/mxfdemux.h: + * gst/mxf/mxfparse.c: (mxf_umid_from_string): + * gst/mxf/mxfparse.h: + Add property to select the top-level source package or material + package that should be used for playback. + +2008-11-30 Sebastian Dröge <seb...@co...> * gst/mxf/mxfdemux.c: (gst_mxf_demux_pull_random_index_pack): Make sure that demux->offset has the correct value before calling any gst_mxf_demux_handle_* functions. Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- mxfdemux.c 30 Nov 2008 16:21:42 -0000 1.17 +++ mxfdemux.c 30 Nov 2008 17:26:54 -0000 1.18 @@ -138,6 +138,12 @@ pad->last_flow = GST_FLOW_OK; } +enum +{ + PROP_0, + PROP_PACKAGE +}; static gboolean gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event); static gboolean gst_mxf_demux_src_event (GstPad * pad, GstEvent * event); static const GstQueryType *gst_mxf_demux_src_query_type (GstPad * pad); @@ -168,6 +174,17 @@ static void +gst_mxf_demux_remove_pads (GstMXFDemux * demux) + if (demux->src) { + g_ptr_array_foreach (demux->src, (GFunc) gst_mxf_demux_remove_pad, demux); + g_ptr_array_foreach (demux->src, (GFunc) gst_object_unref, NULL); + g_ptr_array_free (demux->src, TRUE); + demux->src = NULL; + } +} +static void gst_mxf_demux_reset_mxf_state (GstMXFDemux * demux) { GST_DEBUG_OBJECT (demux, "Resetting MXF state"); @@ -384,12 +401,7 @@ gst_adapter_clear (demux->adapter); - if (demux->src) { - g_ptr_array_foreach (demux->src, (GFunc) gst_mxf_demux_remove_pad, demux); - g_ptr_array_foreach (demux->src, (GFunc) gst_object_unref, NULL); - g_ptr_array_free (demux->src, TRUE); - demux->src = NULL; - } + gst_mxf_demux_remove_pads (demux); if (demux->partition_index) { g_array_free (demux->partition_index, TRUE); @@ -1293,8 +1305,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1608,62 +1621,88 @@ return ret; -static GstFlowReturn -gst_mxf_demux_handle_header_metadata_update_streams (GstMXFDemux * demux) +static MXFMetadataGenericPackage * +gst_mxf_demux_find_package (GstMXFDemux * demux, const MXFUMID * umid) - MXFMetadataGenericPackage *current_package = NULL; - guint i, j, k; - gboolean first_run; + MXFMetadataGenericPackage *ret = NULL; + guint i; - GST_DEBUG_OBJECT (demux, "Updating streams"); + if (demux->package) { + for (i = 0; i < demux->package->len; i++) { + MXFMetadataGenericPackage *p = g_ptr_array_index (demux->package, i); -choose_package: - /* If no package was selected, select the first material package */ - if (mxf_umid_is_zero (&demux->current_package_uid) - && !demux->material_package) { - GST_ERROR_OBJECT (demux, "No material package"); - return GST_FLOW_ERROR; - } else if (mxf_umid_is_zero (&demux->current_package_uid)) { - MXFMetadataGenericPackage *p = - (MXFMetadataGenericPackage *) demux->material_package->data; - memcpy (&demux->current_package_uid, &p->package_uid, 32); - current_package = p; - if (demux->src) { - for (i = 0; i < demux->src->len; i++) { - GstMXFPad *pad = g_ptr_array_index (demux->src, i); - gst_element_remove_pad (GST_ELEMENT_CAST (demux), GST_PAD_CAST (pad)); - gst_object_unref (pad); + if (mxf_umid_is_equal (&p->package_uid, umid)) { + ret = p; + break; } - g_ptr_array_free (demux->src, TRUE); - demux->src = NULL; } } - if (!current_package && demux->package) { - for (i = 0; i < demux->package->len; i++) { - MXFMetadataGenericPackage *p = g_ptr_array_index (demux->package, i); + return ret; - if (mxf_umid_is_equal (&p->package_uid, &demux->current_package_uid)) { - current_package = p; - break; +gst_mxf_demux_choose_package (GstMXFDemux * demux) + if (demux->requested_package_string) { + MXFUMID umid; + if (!mxf_umid_from_string (demux->requested_package_string, &umid)) { + GST_ERROR_OBJECT (demux, "Invalid requested package"); + } else { + if (memcmp (&umid, &demux->current_package_uid, 32) != 0) { + if (demux->src) + gst_element_no_more_pads (GST_ELEMENT_CAST (demux)); + gst_mxf_demux_remove_pads (demux); + memcpy (&demux->current_package_uid, &umid, 32); + g_free (demux->requested_package_string); + demux->requested_package_string = NULL; - if (!current_package) { + if (!mxf_umid_is_zero (&demux->current_package_uid)) + ret = gst_mxf_demux_find_package (demux, &demux->current_package_uid); + if (ret && (ret->type == MXF_METADATA_GENERIC_PACKAGE_TOP_LEVEL_SOURCE + || ret->type == MXF_METADATA_GENERIC_PACKAGE_MATERIAL)) + return ret; + else if (ret && ret->type == MXF_METADATA_GENERIC_PACKAGE_SOURCE) GST_WARNING_OBJECT (demux, - "Selected package not found in header metadata, choosing the first best"); - memset (&demux->current_package_uid, 0, sizeof (MXFUMID)); - goto choose_package; - - if (current_package->type == MXF_METADATA_GENERIC_PACKAGE_SOURCE) { + "Current package is not a material package or top-level source package, choosing the first best"); + else if (!mxf_umid_is_zero (&demux->current_package_uid)) - "Selected package is not a material package or top-level source package, choosing the first best"); + "Current package not found, choosing the first best"); + if (!demux->material_package) { + GST_ERROR_OBJECT (demux, "No material package"); + return NULL; + } else { + MXFMetadataGenericPackage *p = + (MXFMetadataGenericPackage *) demux->material_package->data; + memcpy (&demux->current_package_uid, &p->package_uid, 32); + if (!ret) + GST_ERROR_OBJECT (demux, "No suitable package found"); +static GstFlowReturn +gst_mxf_demux_handle_header_metadata_update_streams (GstMXFDemux * demux) + MXFMetadataGenericPackage *current_package = NULL; + guint i, j, k; + gboolean first_run; + GST_DEBUG_OBJECT (demux, "Updating streams"); + current_package = gst_mxf_demux_choose_package (demux); if (!current_package->tracks) { GST_ERROR_OBJECT (demux, "Current package has no (resolved) tracks"); return GST_FLOW_ERROR; @@ -2541,6 +2580,11 @@ gst_mxf_demux_handle_header_metadata_update_streams (demux)) != GST_FLOW_OK) goto beach; + } else if (!demux->update_metadata && demux->requested_package_string) { + if ((ret = + gst_mxf_demux_handle_header_metadata_update_streams (demux)) != + GST_FLOW_OK) + goto beach; if (!mxf_is_mxf_packet (key)) { @@ -3091,6 +3135,39 @@ +gst_mxf_demux_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) + GstMXFDemux *demux = GST_MXF_DEMUX (object); + switch (prop_id) { + case PROP_PACKAGE: + g_free (demux->requested_package_string); + demux->requested_package_string = g_value_dup_string (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +gst_mxf_demux_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) + g_value_set_string (value, demux->current_package_string); gst_mxf_demux_finalize (GObject * object) GstMXFDemux *demux = GST_MXF_DEMUX (object); @@ -3110,12 +3187,12 @@ demux->close_seg_event = NULL; + g_free (demux->current_package_string); + demux->current_package_string = NULL; + g_free (demux->requested_package_string); + demux->requested_package_string = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); @@ -3146,7 +3223,14 @@ GST_DEBUG_CATEGORY_INIT (mxfdemux_debug, "mxfdemux", 0, "MXF demuxer"); - gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_mxf_demux_finalize); + gobject_class->finalize = gst_mxf_demux_finalize; + gobject_class->set_property = gst_mxf_demux_set_property; + gobject_class->get_property = gst_mxf_demux_get_property; + g_object_class_install_property (gobject_class, PROP_PACKAGE, + g_param_spec_string ("package", "Package", + "Material or Source package to use for playback", NULL, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_mxf_demux_change_state); Index: mxfdemux.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- mxfdemux.h 28 Nov 2008 11:24:23 -0000 1.5 +++ mxfdemux.h 30 Nov 2008 17:26:54 -0000 1.6 @@ -99,6 +99,8 @@ MXFUMID current_package_uid; MXFMetadataGenericPackage *current_package; + gchar *current_package_string; + gchar *requested_package_string; }; struct _GstMXFDemuxClass Index: mxfparse.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- mxfparse.c 29 Nov 2008 20:25:06 -0000 1.13 +++ mxfparse.c 30 Nov 2008 17:26:55 -0000 1.14 @@ -271,6 +271,37 @@ return str; +MXFUMID * +mxf_umid_from_string (const gchar * str, MXFUMID * umid) + gint len; + guint i, j; + g_return_val_if_fail (str != NULL, NULL); + len = strlen (str); + memset (umid, 0, 32); + if (len != 95) { + GST_ERROR ("Invalid UMID string length %d", len); + for (i = 0, j = 0; i < 32; i++) { + if (!g_ascii_isxdigit (str[j]) || + !g_ascii_isxdigit (str[j + 1]) || + (str[j + 2] != '.' && str[j + 2] != '\0')) { + GST_ERROR ("Invalid UMID string '%s'", str); + return NULL; + } + umid->u[i] = + (g_ascii_xdigit_value (str[j]) << 4) | (g_ascii_xdigit_value (str[j + + 1])); + j += 3; + return umid; static guint gst_mxf_ul_hash (const MXFUL * key) Index: mxfparse.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfparse.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- mxfparse.h 28 Nov 2008 11:24:24 -0000 1.9 +++ mxfparse.h 30 Nov 2008 17:26:55 -0000 1.10 @@ -35,6 +35,7 @@ gboolean mxf_ul_is_zero (const MXFUL *ul); gchar *mxf_umid_to_string (const MXFUMID * umid, gchar str[96]); +MXFUMID *mxf_umid_from_string (const gchar *str, MXFUMID * umid); gboolean mxf_umid_is_equal (const MXFUMID *a, const MXFUMID *b); gboolean mxf_umid_is_zero (const MXFUMID *umid); |
From: <sl...@ke...> - 2008-11-30 17:42:50
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sun Nov 30 2008 17:42:44 UTC Log message: * 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. Modified files: . : ChangeLog gst/mxf : mxfalaw.c mxfalaw.h mxfdemux.c mxfjpeg2000.c mxfjpeg2000.h mxfmpeg.c mxfmpeg.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3769&r2=1.3770 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3769 retrieving revision 1.3770 diff -u -d -r1.3769 -r1.3770 --- ChangeLog 30 Nov 2008 17:26:53 -0000 1.3769 +++ ChangeLog 30 Nov 2008 17:42:28 -0000 1.3770 @@ -1,5 +1,18 @@ 2008-11-30 Sebastian Dröge <seb...@co...> + * 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. + +2008-11-30 Sebastian Dröge <seb...@co...> * gst/mxf/mxfdemux.c: (gst_mxf_demux_remove_pads), (gst_mxf_demux_reset), (gst_mxf_demux_find_package), (gst_mxf_demux_choose_package), Index: mxfalaw.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- mxfalaw.c 28 Nov 2008 18:13:30 -0000 1.1 +++ mxfalaw.c 30 Nov 2008 17:42:29 -0000 1.2 @@ -34,7 +34,7 @@ #define GST_CAT_DEFAULT mxf_debug gboolean -mxf_is_alaw_audio_essence_track (const MXFMetadataTrack * track) +mxf_is_alaw_essence_track (const MXFMetadataTrack * track) { guint i; @@ -99,8 +99,8 @@ s = (MXFMetadataGenericSoundEssenceDescriptor *) track->descriptor[i]; f = track->descriptor[i]; break; - } else if (((MXFMetadataGenericDescriptor *) track-> - descriptor[i])->is_file_descriptor + } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])-> + is_file_descriptor && ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type != MXF_METADATA_MULTIPLE_DESCRIPTOR) { Index: mxfalaw.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.h,v --- mxfalaw.h 28 Nov 2008 18:13:30 -0000 1.1 +++ mxfalaw.h 30 Nov 2008 17:42:30 -0000 1.2 @@ -28,7 +28,7 @@ #include "mxfparse.h" -gboolean mxf_is_alaw_audio_essence_track (const MXFMetadataTrack *track); +gboolean mxf_is_alaw_essence_track (const MXFMetadataTrack *track); GstCaps * mxf_alaw_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- mxfdemux.c 30 Nov 2008 17:26:54 -0000 1.18 +++ mxfdemux.c 30 Nov 2008 17:42:30 -0000 1.19 @@ -1305,9 +1305,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1865,15 +1864,15 @@ switch (track_type) { case MXF_METADATA_TRACK_PICTURE_ESSENCE: - if (mxf_is_mpeg_video_essence_track (source_track)) + if (mxf_is_mpeg_essence_track (source_track)) caps = - mxf_mpeg_video_create_caps (source_package, source_track, + mxf_mpeg_create_caps (source_package, source_track, &pad->tags, &pad->handle_essence_element, &pad->mapping_data); else if (mxf_is_dv_dif_essence_track (source_track)) mxf_dv_dif_create_caps (source_package, source_track, - else if (mxf_is_jpeg2000_video_essence_track (source_track)) + else if (mxf_is_jpeg2000_essence_track (source_track)) mxf_jpeg2000_create_caps (source_package, source_track, @@ -1887,10 +1886,14 @@ - else if (mxf_is_alaw_audio_essence_track (source_track)) + else if (mxf_is_alaw_essence_track (source_track)) mxf_alaw_create_caps (source_package, source_track, + else if (mxf_is_mpeg_essence_track (source_track)) + caps = + &pad->tags, &pad->handle_essence_element, &pad->mapping_data); break; case MXF_METADATA_TRACK_DATA_ESSENCE: if (mxf_is_dv_dif_essence_track (source_track)) Index: mxfjpeg2000.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c,v retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mxfjpeg2000.c 30 Nov 2008 14:12:04 -0000 1.2 +++ mxfjpeg2000.c 30 Nov 2008 17:42:30 -0000 1.3 @@ -38,7 +38,7 @@ -mxf_is_jpeg2000_video_essence_track (const MXFMetadataTrack * track) +mxf_is_jpeg2000_essence_track (const MXFMetadataTrack * track) @@ -106,8 +106,8 @@ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->descriptor[i]; Index: mxfjpeg2000.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.h,v --- mxfjpeg2000.h 29 Nov 2008 20:25:06 -0000 1.1 +++ mxfjpeg2000.h 30 Nov 2008 17:42:30 -0000 1.2 -gboolean mxf_is_jpeg2000_video_essence_track (const MXFMetadataTrack *track); +gboolean mxf_is_jpeg2000_essence_track (const MXFMetadataTrack *track); mxf_jpeg2000_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); Index: mxfmpeg.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- mxfmpeg.c 30 Nov 2008 14:12:04 -0000 1.6 +++ mxfmpeg.c 30 Nov 2008 17:42:30 -0000 1.7 @@ -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 @@ } -mxf_is_mpeg_video_essence_track (const MXFMetadataTrack * track) +mxf_is_mpeg_essence_track (const MXFMetadataTrack * track) @@ -243,14 +244,84 @@ 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, + } else if (p->picture_essence_coding.u[13] == 0x10) { + caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, + } 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, + 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]); + } + if (caps) + *handler = mxf_mpeg_video_handle_essence_element; + return caps; +} -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; GstCaps *caps = NULL; @@ -277,6 +348,11 @@ } 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) { } @@ -287,62 +363,13 @@ 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, - } else if (p->picture_essence_coding.u[13] == 0x10) { - caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, - } 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, - 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]); - } + 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"); @@ -354,7 +381,6 @@ } else if (f->essence_container.u[13] == 0x09) { GST_DEBUG ("Found MPEG TS stream"); caps = gst_caps_new_simple ("video/mpegts", NULL); if (p) Index: mxfmpeg.h RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.h,v retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mxfmpeg.h 25 Nov 2008 09:38:26 -0000 1.3 +++ mxfmpeg.h 30 Nov 2008 17:42:30 -0000 1.4 @@ -52,9 +52,9 @@ gboolean mxf_metadata_mpeg_video_descriptor_handle_tag (MXFMetadataGenericDescriptor *descriptor, const MXFPrimerPack *primer, guint16 tag, const guint8 *tag_data, guint16 tag_size); void mxf_metadata_mpeg_video_descriptor_reset (MXFMetadataMPEGVideoDescriptor *descriptor); -gboolean mxf_is_mpeg_video_essence_track (const MXFMetadataTrack *track); +gboolean mxf_is_mpeg_essence_track (const MXFMetadataTrack *track); -mxf_mpeg_video_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); +mxf_mpeg_create_caps (MXFMetadataGenericPackage *package, MXFMetadataTrack *track, GstTagList **tags, MXFEssenceElementHandler *handler, gpointer *mapping_data); #endif /* __MXF_MPEG_H__ */ |
From: <sl...@ke...> - 2008-11-30 17:58:49
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Sun Nov 30 2008 17:58:46 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_header_metadata_resolve_references): If there's no descriptor for the track in the track's source package and there's a single descriptor without a linked track assume that it belongs to this track. Modified files: . : ChangeLog gst/mxf : mxfdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3770&r2=1.3771 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.19&r2=1.20 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3770 retrieving revision 1.3771 diff -u -d -r1.3770 -r1.3771 --- ChangeLog 30 Nov 2008 17:42:28 -0000 1.3770 +++ ChangeLog 30 Nov 2008 17:58:31 -0000 1.3771 @@ -1,5 +1,13 @@ 2008-11-30 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfdemux.c: + (gst_mxf_demux_handle_header_metadata_resolve_references): + If there's no descriptor for the track in the track's source + package and there's a single descriptor without a linked track + assume that it belongs to this track. + +2008-11-30 Sebastian Dröge <seb...@co...> * gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track): * gst/mxf/mxfalaw.h: * gst/mxf/mxfdemux.c: Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- mxfdemux.c 30 Nov 2008 17:42:30 -0000 1.19 +++ mxfdemux.c 30 Nov 2008 17:58:32 -0000 1.20 @@ -1305,8 +1305,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1392,7 +1393,7 @@ if (package->tracks && package->descriptors) { for (j = 0; j < package->n_tracks; j++) { MXFMetadataTrack *track = package->tracks[j]; - guint n_descriptor = 0; + guint i, n_descriptor = 0; if (!track) continue; @@ -1406,14 +1407,15 @@ e = (MXFMetadataFileDescriptor *) d; - if (e->linked_track_id == track->track_id) + if (e->linked_track_id == track->track_id || + e->linked_track_id == 0) n_descriptor++; } track->n_descriptor = n_descriptor; track->descriptor = g_new0 (MXFMetadataFileDescriptor *, n_descriptor); - n_descriptor = 0; + i = 0; for (k = 0; k < package->n_descriptors; k++) { MXFMetadataGenericDescriptor *d = package->descriptors[k]; @@ -1424,8 +1426,9 @@ - track->descriptor[n_descriptor++] = e; + (e->linked_track_id == 0 && n_descriptor == 1)) + track->descriptor[i++] = e; } |
From: <sl...@ke...> - 2008-12-01 14:25:44
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Mon Dec 01 2008 14:25:33 UTC Log message: * gst/mxf/mxfdemux.c: (gst_mxf_demux_choose_package): If the preface references a primary package use this as the default playback package unless one was specified by the "package" property. If there's no preface primary package still try to use the first material package. Modified files: . : ChangeLog gst/mxf : mxfdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3771&r2=1.3772 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.20&r2=1.21 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3771 retrieving revision 1.3772 diff -u -d -r1.3771 -r1.3772 --- ChangeLog 30 Nov 2008 17:58:31 -0000 1.3771 +++ ChangeLog 1 Dec 2008 14:25:16 -0000 1.3772 @@ -1,3 +1,11 @@ +2008-12-01 Sebastian Dröge <seb...@co...> + + * gst/mxf/mxfdemux.c: (gst_mxf_demux_choose_package): + If the preface references a primary package use this as the default + playback package unless one was specified by the "package" property. + If there's no preface primary package still try to use the first + material package. 2008-11-30 Sebastian Dröge <seb...@co...> * gst/mxf/mxfdemux.c: Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- mxfdemux.c 30 Nov 2008 17:58:32 -0000 1.20 +++ mxfdemux.c 1 Dec 2008 14:25:19 -0000 1.21 @@ -1305,9 +1305,8 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux-> - content_storage.essence_container_data_uids[j], - &data->instance_uid)) { + if (mxf_ul_is_equal (&demux->content_storage. + essence_container_data_uids[j], &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -1677,6 +1676,12 @@ GST_WARNING_OBJECT (demux, "Current package not found, choosing the first best"); + if (demux->preface.primary_package) + ret = demux->preface.primary_package; + if (ret && (ret->type == MXF_METADATA_GENERIC_PACKAGE_TOP_LEVEL_SOURCE + || ret->type == MXF_METADATA_GENERIC_PACKAGE_MATERIAL)) + return ret; if (!demux->material_package) { GST_ERROR_OBJECT (demux, "No material package"); return NULL; |
From: <sl...@ke...> - 2008-12-01 15:24:57
|
CVS Root: /cvs/gstreamer Module: gst-plugins-bad Changes by: slomo Date: Mon Dec 01 2008 15:24:51 UTC Log message: * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps): * gst/mxf/mxfalaw.c: (mxf_alaw_create_caps): * gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_generic_container_essence_element): * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps): * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): * gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps), (mxf_mpeg_create_caps): Add the codec name, and if possible the avg bitrate, to the pad's taglist. Modified files: . : ChangeLog gst/mxf : mxfaes-bwf.c mxfalaw.c mxfdemux.c mxfdv-dif.c mxfjpeg2000.c mxfmpeg.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/ChangeLog.diff?r1=1.3772&r2=1.3773 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-bad/ChangeLog,v retrieving revision 1.3772 retrieving revision 1.3773 diff -u -d -r1.3772 -r1.3773 --- ChangeLog 1 Dec 2008 14:25:16 -0000 1.3772 +++ ChangeLog 1 Dec 2008 15:24:35 -0000 1.3773 @@ -1,5 +1,17 @@ 2008-12-01 Sebastian Dröge <seb...@co...> + * gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps): + * gst/mxf/mxfalaw.c: (mxf_alaw_create_caps): + * gst/mxf/mxfdemux.c: + (gst_mxf_demux_handle_generic_container_essence_element): + * gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps): + * gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps): + * gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps), + (mxf_mpeg_create_caps): + Add the codec name, and if possible the avg bitrate, to the pad's taglist. + +2008-12-01 Sebastian Dröge <seb...@co...> * gst/mxf/mxfdemux.c: (gst_mxf_demux_choose_package): If the preface references a primary package use this as the default playback package unless one was specified by the "package" property. Index: mxfaes-bwf.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfaes-bwf.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- mxfaes-bwf.c 28 Nov 2008 18:13:29 -0000 1.5 +++ mxfaes-bwf.c 1 Dec 2008 15:24:36 -0000 1.6 @@ -258,6 +258,7 @@ GstCaps *ret = NULL; MXFMetadataWaveAudioEssenceDescriptor *wa_descriptor = NULL; gchar str[48]; + gchar *codec_name = NULL; if (((MXFMetadataGenericDescriptor *) descriptor)->type == MXF_METADATA_WAVE_AUDIO_ESSENCE_DESCRIPTOR) @@ -293,6 +294,10 @@ (block_align != 1), "endianness", G_TYPE_INT, G_LITTLE_ENDIAN, "depth", G_TYPE_INT, (block_align / descriptor->channel_count) * 8, "width", G_TYPE_INT, (block_align / descriptor->channel_count) * 8, NULL); + codec_name = + g_strdup_printf ("Uncompressed %u-bit little endian integer PCM audio", + (block_align / descriptor->channel_count) * 8); } else if (mxf_ul_is_equal (&descriptor->sound_essence_compression, &mxf_sound_essence_compression_aiff)) { guint block_align; @@ -318,6 +323,10 @@ (block_align != 1), "endianness", G_TYPE_INT, G_BIG_ENDIAN, "depth", + g_strdup_printf ("Uncompressed %u-bit big endian integer PCM audio", &mxf_sound_essence_compression_alaw)) { @@ -331,11 +340,25 @@ (gint) (((gdouble) descriptor->audio_sampling_rate.n) / ((gdouble) descriptor->audio_sampling_rate.d) + 0.5), "channels", G_TYPE_INT, descriptor->channel_count); + codec_name = g_strdup ("A-law encoded audio"); } else { GST_ERROR ("Unsupported sound essence compression: %s", mxf_ul_to_string (&descriptor->sound_essence_compression, str)); } + if (!*tags) + *tags = gst_tag_list_new (); + if (codec_name) { + gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_AUDIO_CODEC, + codec_name, NULL); + g_free (codec_name); + } + if (wa_descriptor && wa_descriptor->avg_bps) + gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_BITRATE, + wa_descriptor->avg_bps * 8, NULL); *handler = mxf_bwf_handle_essence_element; return ret; Index: mxfalaw.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfalaw.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- mxfalaw.c 30 Nov 2008 17:42:29 -0000 1.2 +++ mxfalaw.c 1 Dec 2008 15:24:37 -0000 1.3 @@ -80,7 +80,6 @@ MXFMetadataTrack * track, GstTagList ** tags, MXFEssenceElementHandler * handler, gpointer * mapping_data) { - MXFMetadataFileDescriptor *f = NULL; MXFMetadataGenericSoundEssenceDescriptor *s = NULL; guint i; GstCaps *caps = NULL; @@ -97,37 +96,32 @@ if (((MXFMetadataGenericDescriptor *) track->descriptor[i])->type == MXF_METADATA_GENERIC_SOUND_ESSENCE_DESCRIPTOR) { s = (MXFMetadataGenericSoundEssenceDescriptor *) track->descriptor[i]; - f = track->descriptor[i]; break; - } else if (((MXFMetadataGenericDescriptor *) track->descriptor[i])-> - is_file_descriptor - && ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type != - MXF_METADATA_MULTIPLE_DESCRIPTOR) { } - if (!f) { - GST_ERROR ("No descriptor found for this track"); + if (!s) { + GST_ERROR ("No generic sound essence descriptor found for this track"); return NULL; *handler = mxf_alaw_handle_essence_element; - caps = gst_caps_new_simple ("audio/x-alaw", NULL); - if (s) { - if (s->audio_sampling_rate.n != 0 && s->audio_sampling_rate.d != 0) - gst_caps_set_simple (caps, "rate", G_TYPE_INT, - (gint) (((gdouble) s->audio_sampling_rate.n) / - ((gdouble) s->audio_sampling_rate.d) + 0.5), NULL); + if (s && s->audio_sampling_rate.n != 0 && s->audio_sampling_rate.d != 0 && + s->channel_count != 0) { - if (s->channel_count != 0) - gst_caps_set_simple (caps, "channels", G_TYPE_INT, s->channel_count, - NULL); + caps = gst_caps_new_simple ("audio/x-alaw", "rate", G_TYPE_INT, + (gint) (((gdouble) s->audio_sampling_rate.n) / + ((gdouble) s->audio_sampling_rate.d) + 0.5), + "channels", G_TYPE_INT, s->channel_count, NULL); /* TODO: Handle channel layout somehow? */ - } else { - GST_WARNING ("Only a generic sound essence descriptor found"); + if (!*tags) + *tags = gst_tag_list_new (); + "A-law encoded audio", NULL); return caps; Index: mxfdemux.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdemux.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- mxfdemux.c 1 Dec 2008 14:25:19 -0000 1.21 +++ mxfdemux.c 1 Dec 2008 15:24:37 -0000 1.22 @@ -1305,8 +1305,9 @@ MXFMetadataEssenceContainerData, i); for (j = 0; j < demux->content_storage.n_essence_container_data; j++) { - if (mxf_ul_is_equal (&demux->content_storage. - essence_container_data_uids[j], &data->instance_uid)) { + if (mxf_ul_is_equal (&demux-> + content_storage.essence_container_data_uids[j], + &data->instance_uid)) { demux->content_storage.essence_container_data[j] = data; break; } @@ -2152,13 +2153,18 @@ return GST_FLOW_OK; - /* TODO: Use a better start value */ if (pad->need_segment) { gst_pad_push_event (GST_PAD_CAST (pad), gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, -1, 0)); pad->need_segment = FALSE; + if (pad->tags) { + gst_element_found_tags_for_pad (GST_ELEMENT_CAST (demux), + GST_PAD_CAST (pad), pad->tags); + pad->tags = NULL; /* Create subbuffer to be able to change metadata */ inbuf = gst_buffer_create_sub (buffer, 0, GST_BUFFER_SIZE (buffer)); @@ -2197,6 +2203,7 @@ if (outbuf) { + /* TODO: handle timestamp gaps */ ret = gst_pad_push (GST_PAD_CAST (pad), outbuf); ret = gst_mxf_demux_combine_flows (demux, pad, ret); Index: mxfdv-dif.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfdv-dif.c,v retrieving revision 1.1 diff -u -d -r1.1 -r1.2 --- mxfdv-dif.c 27 Nov 2008 10:09:53 -0000 1.1 +++ mxfdv-dif.c 1 Dec 2008 15:24:37 -0000 1.2 @@ -91,8 +91,8 @@ for (i = 0; i < track->n_descriptor; i++) { - if (((MXFMetadataGenericDescriptor *) track->descriptor[i])-> + if (((MXFMetadataGenericDescriptor *) track-> + descriptor[i])->is_file_descriptor && ((MXFMetadataGenericDescriptor *) track->descriptor[i])->type != MXF_METADATA_MULTIPLE_DESCRIPTOR) { f = track->descriptor[i]; @@ -116,6 +116,12 @@ caps = gst_caps_new_simple ("video/x-dv", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_CODEC, "DV-DIF", + NULL); Index: mxfjpeg2000.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfjpeg2000.c,v retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- mxfjpeg2000.c 30 Nov 2008 17:42:30 -0000 1.3 +++ mxfjpeg2000.c 1 Dec 2008 15:24:37 -0000 1.4 @@ -106,8 +106,8 @@ p = (MXFMetadataGenericPictureEssenceDescriptor *) track->descriptor[i]; + } else if (((MXFMetadataGenericDescriptor *) track-> @@ -129,5 +129,10 @@ GST_WARNING ("Only a generic file descriptor found"); + gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, + "JPEG 2000", NULL); } Index: mxfmpeg.c RCS file: /cvs/gstreamer/gst-plugins-bad/gst/mxf/mxfmpeg.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- mxfmpeg.c 30 Nov 2008 17:42:30 -0000 1.7 +++ mxfmpeg.c 1 Dec 2008 15:24:37 -0000 1.8 @@ -254,6 +254,7 @@ MXFMetadataMPEGVideoDescriptor * d) + const gchar *codec_name = NULL; /* SMPTE RP224 */ if (!p || mxf_ul_is_zero (&p->picture_essence_coding)) { @@ -262,6 +263,7 @@ gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + codec_name = "MPEG-2 Video"; } else if (p->picture_essence_coding.u[0] != 0x06 || p->picture_essence_coding.u[1] != 0x0e || p->picture_essence_coding.u[2] != 0x2b @@ -280,9 +282,11 @@ p->picture_essence_coding.u[13] <= 0x08) { caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 2, } else if (p->picture_essence_coding.u[13] == 0x10) { caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 1, + codec_name = "MPEG-1 Video"; } else if (p->picture_essence_coding.u[13] == 0x20) { MXFLocalTag *local_tag = (((MXFMetadataGenericDescriptor *) f)->other_tags) ? @@ -300,15 +304,21 @@ NULL); gst_buffer_unref (codec_data); - + codec_name = "MPEG-4 Video"; GST_ERROR ("Unsupported MPEG picture essence coding 0x%02x", p->picture_essence_coding.u[13]); caps = NULL; - if (caps) + if (caps) { *handler = mxf_mpeg_video_handle_essence_element; + if (codec_name) + gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, + codec_name, NULL); @@ -378,9 +388,19 @@ GST_DEBUG ("Found MPEG PS stream"); "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC, + "MPEG PS", NULL); } else if (f->essence_container.u[13] == 0x09) { GST_DEBUG ("Found MPEG TS stream"); caps = gst_caps_new_simple ("video/mpegts", NULL); + "MPEG TS", NULL); if (p) |