Commit graph

269 commits

Author SHA1 Message Date
Sebastian Dröge
0d8099685d mxfdemux: Handle some more special cases when setting the position when seeking 2009-02-06 10:46:47 +01:00
Sebastian Dröge
bb11522f1d mxfdemux: Adjust last_stop to the last keyframe when seeking 2009-02-06 10:46:09 +01:00
Sebastian Dröge
22cb259f19 mxfdemux: Fix logic for finding the previous keyframe 2009-02-06 10:06:59 +01:00
Sebastian Dröge
6208795598 mxfdemux: Add keyframe detection for MPEG2 video streams
This is useful for seeking as we usually want to seek to the previous
keyframe. The keyframe detection is done by parsing the MPEG2
elementary stream and if a GOP or I-frame packet is found we
assume a keyframe in this edit unit.
2009-02-06 09:53:13 +01:00
Sebastian Dröge
c9f6a8b586 mxfdemux: Protect the metadata with a lock against concurrent access 2009-02-05 21:29:29 +01:00
Sebastian Dröge
ad2a64870c Update TODO 2009-02-04 11:12:14 +01:00
Sebastian Dröge
3e2a880c6b Post an UMID tag with the current package's UMID 2009-02-04 11:12:14 +01:00
Sebastian Dröge
c0557df34d Reset the current partition after seeking and NEWSEGMENT events 2009-02-04 11:12:13 +01:00
Sebastian Dröge
2ee7e7768d In push mode play all remaining parts of the file on EOS if there are any 2009-02-04 11:12:13 +01:00
Sebastian Dröge
cc5699340d Add property to set the maximum allowed time difference between tracks 2009-02-04 11:12:13 +01:00
Sebastian Dröge
fd72ef34f6 Always set the current package, not only when it was changed
This is necessary as the current package link will be set to NULL
when updated metadata is parsed and should be set here again.
2009-02-04 11:12:13 +01:00
Sebastian Dröge
a79c4e0314 Try to resolve all synchronization issues, not only the first 2009-02-04 11:12:13 +01:00
Sebastian Dröge
c4a0bc9887 Remove some checks that will always be TRUE 2009-02-04 11:12:13 +01:00
Sebastian Dröge
18e2ffa484 Cleanup playback package selection and notify about the current package 2009-02-02 17:48:47 +01:00
Sebastian Dröge
5277650a20 Update tags properly, especially on component switch 2009-02-02 16:23:30 +01:00
Sebastian Dröge
0c756199c0 Error out if no pads could be created 2009-02-02 16:05:14 +01:00
Sebastian Dröge
ee131d8af7 Resolve metadata and update tracks if necessary before seeking 2009-02-02 15:54:23 +01:00
Sebastian Dröge
5e57a0a052 Don't go after the last component of a track 2009-02-02 15:54:00 +01:00
Sebastian Dröge
92f372ba30 Return an error if updating an already existing pad fails 2009-02-02 15:53:32 +01:00
Sebastian Dröge
60f5c6f03f Fix seeking if the source clip duration is unknown 2009-02-02 07:44:12 +01:00
Sebastian Dröge
0ac0645de6 Add initial support for seeking in push mode 2009-02-01 17:00:33 +01:00
Sebastian Dröge
99298da3d5 Fix deadlocks when seeking in pull mode failed and check new offset before using it 2009-02-01 17:00:33 +01:00
Sebastian Dröge
43ade6cf71 Update offset in push mode and handle events properly 2009-02-01 17:00:23 +01:00
Sebastian Dröge
58a3220dde Implement initial seeking support (pull mode only) 2009-02-01 15:07:09 +01:00
Sebastian Dröge
6a09f5f4fe Don't use GLib 2.16 API unconditionally 2009-01-31 11:29:20 +01:00
Sebastian Dröge
93a2b5c9ea Check for EOS on all pads after adjusting the essence track durations 2009-01-31 11:02:26 +01:00
Sebastian Dröge
ebd8b8dbaf Fix duration calculation for essence tracks 2009-01-31 11:02:26 +01:00
Sebastian Dröge
f638caef57 Implement GstElement::query/get_query_types vfuncs 2009-01-31 11:02:26 +01:00
Sebastian Dröge
061a96fa94 Reset all internal state in finalize 2009-01-31 11:02:26 +01:00
Sebastian Dröge
02769b4a4d Improve EOS detection and fix push mode for the last pushed in buffer 2009-01-31 11:02:26 +01:00
Sebastian Dröge
707136fe5d Keep track of essence track position when playing source packages
This ensures that the correct essence elements are played and
that we seek to the correct essence elements.
2009-01-31 11:02:26 +01:00
Sebastian Dröge
dfa0e43848 Compensate for timestamp/duration rounding errors 2009-01-31 11:02:25 +01:00
Sebastian Dröge
a930b36adc Improve EOS logic to check all pads when pulling a packet returned EOS
This makes sure that we finish all pads that are at EOS now instead of
just finishing one and returning to this point over and over again.
2009-01-31 11:02:25 +01:00
Sebastian Dröge
2dbe706330 Only push buffers for pads that are not more than 500ms before other pads 2009-01-31 11:02:25 +01:00
Sebastian Dröge
91ed2ef166 Improve EOS logic to only go into EOS after all tracks are finished 2009-01-31 11:02:25 +01:00
Sebastian Dröge
b783f38813 Update TODO list 2009-01-31 11:02:25 +01:00
Sebastian Dröge
20c92a4db3 Try to keep the timestamp difference between tracks lower than 500ms 2009-01-31 11:02:25 +01:00
Sebastian Dröge
742fc4e80d Fix playback of atom files 2009-01-31 11:02:25 +01:00
Sebastian Dröge
f404262adf Keep track of current playback position 2009-01-31 11:02:25 +01:00
Sebastian Dröge
556e3c46e4 Set essence track positions to 0 if we're at the start partition 2009-01-31 11:02:24 +01:00
Sebastian Dröge
91b35975b5 Generate an index table for essence streams
Generate an index table for essence streams during playback
and make sure that only the correct essence elements are
used for played tracks.

Make it possible to have one essence stream used in multiple
playback tracks.

Fix some minor bugs.
2009-01-31 11:02:24 +01:00
Sebastian Dröge
dc42074fa9 Don't complain if the preface has no primary package set 2009-01-31 11:02:24 +01:00
Sebastian Dröge
afbec8ab9b Allow index table segments without primer pack
When parsing an index table segment without a valid
primer pack in this partition only parse the static
local tags and ignore all dynamic ones.

This allows us to use index table segments in some
broken files.
2009-01-31 11:02:24 +01:00
Sebastian Dröge
4162c36f17 Add essence track abstraction
Add an abstraction to represent essence tracks and
use this everywhere. This will later be used to keep
track of positions and to generate/handle seek tables.

Some random cleanup and renaming.
2009-01-31 11:02:24 +01:00
Sebastian Dröge
914b108db9 Fix parsing of index table segments
Allocate memory for the pos tables and slice offsets
of the index entries separately to a) fix alignment in
weird cases and b) to actually have something to free()
in the index table segment reset function.
2009-01-31 11:02:24 +01:00
Sebastian Dröge
264e30abb9 Improve detection of the end of the header metadata
Header metadata is finished after partition.header_byte_count
bytes after the first byte of the primer pack are handled.
After this there can only be index table segments, filler packets,
essence or the start of the next partition.

This fixes playback of some files that have non-standard metadata
packets in the header metadata.
2009-01-31 11:02:24 +01:00
Sebastian Dröge
7ce5b5a2d6 Store all partitions & primer packs in memory for faster access
Store all partitions & primer packs in memory for faster access.
This is later needed for fast seeking.

Pre-fill the list of partitions with the content of the random
index pack.

Don't parse metadata of an partition twice.
2009-01-23 10:09:01 +01:00
Sebastian Dröge
054167100d Fix UL for DTS and MPEG2 layer 1 2009-01-22 13:13:00 +01:00
Sebastian Dröge
6b5f04100a Add support for AAC audio 2009-01-22 13:13:00 +01:00
Sebastian Dröge
716ce72e46 Store MXF metadata in a hash table, keyed by UID
Store the MXF metadata in a hash table, keyed by the
instance UID. This simplifies resolval of the metadata
and makes looping over all metadata sets unnecessary
in most cases.

Additionally parse metadata always. If we already have
a metadata set with the same UID replace it only if
the new metadata set is from a later offset. This
fixes metadata parsing of files where following partitions
don't have a complete copy of the previous metadata.
2009-01-22 13:13:00 +01:00
Sebastian Dröge
52028f2e11 Build the random index pack while parsing
If the file contains no random index pack or just
an invalid one build the random index pack while
parsing.
2009-01-22 13:13:00 +01:00
Sebastian Dröge
fc4be0acca Update copyrights for 2009 2009-01-22 13:13:00 +01:00
Sebastian Dröge
100dfc34d6 Simplify parsing of UL/UUID arrays
Simplify parsing of UL/UUID arrays by abstracting it
into a separate function.
2009-01-22 13:13:00 +01:00
Sebastian Dröge
cd80f534f5 Implement parsing of DMS1 (SMPTE S380M) 2009-01-22 13:12:59 +01:00
Sebastian Dröge
7dad262671 gst/mxf/: "Generation UID" and "This Generation UID" are different so handle them different. Also both are not part o...
Original commit message from CVS:
* gst/mxf/Makefile.am:
* gst/mxf/mxfdemux.c:
* gst/mxf/mxfmetadata.c: (mxf_metadata_handle_tag),
(mxf_metadata_preface_handle_tag),
(mxf_metadata_identification_handle_tag),
(mxf_metadata_content_storage_handle_tag),
(mxf_metadata_essence_container_data_handle_tag),
(mxf_metadata_generic_package_handle_tag),
(mxf_metadata_track_handle_tag),
(mxf_metadata_sequence_handle_tag),
(mxf_metadata_structural_component_handle_tag),
(mxf_metadata_generic_descriptor_handle_tag),
(mxf_metadata_locator_handle_tag),
(mxf_metadata_locator_class_init):
* gst/mxf/mxfmetadata.h:
"Generation UID" and "This Generation UID" are different so handle
them different. Also both are not part of every metadata type.
2009-01-05 13:41:07 +00:00
Sebastian Dröge
caa8349067 gst/mxf/mxfdemux.c: Don't allow negative or zero edit rates to prevent division by zero and we support negative edit ...
Original commit message from CVS:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_pad_next_component):
Don't allow negative or zero edit rates to prevent division
by zero and we support negative edit rates anyway.
2009-01-05 10:34:03 +00:00
Sebastian Dröge
8fcdca999a gst/mxf/: Fix compilation with debugging disabled.
Original commit message from CVS:
* gst/mxf/mxfaes-bwf.c:
(mxf_metadata_wave_audio_essence_descriptor_handle_tag),
(mxf_bwf_create_caps):
* gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_klv_packet):
* gst/mxf/mxfmetadata.c: (mxf_metadata_handle_tag),
(mxf_metadata_preface_handle_tag),
(mxf_metadata_identification_handle_tag),
(mxf_metadata_content_storage_handle_tag),
(mxf_metadata_essence_container_data_handle_tag),
(mxf_metadata_generic_package_handle_tag),
(mxf_metadata_source_package_handle_tag),
(mxf_metadata_track_handle_tag),
(mxf_metadata_sequence_handle_tag),
(mxf_metadata_structural_component_handle_tag),
(mxf_metadata_source_clip_handle_tag),
(mxf_metadata_dm_segment_handle_tag),
(mxf_metadata_generic_descriptor_handle_tag),
(mxf_metadata_file_descriptor_handle_tag),
(mxf_metadata_generic_picture_essence_descriptor_handle_tag),
(mxf_metadata_generic_sound_essence_descriptor_handle_tag),
(mxf_metadata_generic_data_essence_descriptor_handle_tag),
(mxf_metadata_multiple_descriptor_handle_tag):
* gst/mxf/mxfparse.c: (mxf_partition_pack_parse),
(mxf_index_table_segment_parse), (mxf_primer_pack_parse),
(mxf_local_tag_add_to_hash_table):
Fix compilation with debugging disabled.
2009-01-05 10:22:29 +00:00
Sebastian Dröge
71fc2ce3b4 Implement support for OP2a/b/c and OP3a/b/c, i.e. tracks with more than a single component. This currently only works...
Original commit message from CVS:
* gst/mxf/mxfaes-bwf.c: (mxf_bwf_handle_essence_element),
(mxf_aes3_handle_essence_element):
* gst/mxf/mxfalaw.c: (mxf_alaw_handle_essence_element):
* gst/mxf/mxfd10.c: (mxf_d10_picture_handle_essence_element),
(mxf_d10_sound_handle_essence_element):
* gst/mxf/mxfdemux.c: (gst_mxf_demux_pad_init),
(gst_mxf_demux_choose_package),
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_pad_next_component),
(gst_mxf_demux_handle_generic_container_essence_element),
(gst_mxf_demux_parse_footer_metadata),
(gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_src_query):
* gst/mxf/mxfdv-dif.c: (mxf_dv_dif_handle_essence_element):
* gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_handle_essence_element):
* gst/mxf/mxfmetadata.c: (mxf_metadata_sequence_init),
(mxf_metadata_structural_component_init),
(mxf_metadata_generic_picture_essence_descriptor_init):
* gst/mxf/mxfmpeg.c: (mxf_mpeg_video_handle_essence_element),
(mxf_mpeg_audio_handle_essence_element):
* gst/mxf/mxfparse.h:
* gst/mxf/mxfup.c: (mxf_up_handle_essence_element):
* gst/mxf/mxfvc3.c: (mxf_vc3_handle_essence_element):
* tests/check/elements/mxfdemux.c: (_sink_chain):
Implement support for OP2a/b/c and OP3a/b/c, i.e. tracks with
more than a single component. This currently only works for
the case where the components are stored in playback order
in the file.
Set some more default/distinguished values for the structural
metadata.
Make some types more strict by choosing the correct subclasses.
Set DISCONT flag on buffers after a component switch.
Take the last partition from the random index pack for the footer
partition of the header partition doesn't reference the footer
partition. This gives us the final structural metadata for
some more files in the beginning.
2008-12-31 08:53:02 +00:00
Sebastian Dröge
9488ef3764 gst/mxf/mxfmpeg.c: Add initial support for h.264 video (SMPTE RP2008).
Original commit message from CVS:
* gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps),
(mxf_mpeg_create_caps):
Add initial support for h.264 video (SMPTE RP2008).
2008-12-22 20:56:10 +00:00
Sebastian Dröge
2169215a12 gst/mxf/mxfmetadata.*: If resolving a metadata object failed the first time return
Original commit message from CVS:
* gst/mxf/mxfmetadata.c: (mxf_metadata_base_resolve):
* gst/mxf/mxfmetadata.h:
If resolving a metadata object failed the first time return
FALSE for a second mxf_metadata_base_resolve() call instead
of TRUE.
2008-12-22 20:37:24 +00:00
Sebastian Dröge
ed7bd1a9a3 gst/mxf/: Cleanup of the includes.
Original commit message from CVS:
* gst/mxf/mxf.c:
* gst/mxf/mxfaes-bwf.h:
* gst/mxf/mxfd10.c:
* gst/mxf/mxfdms1.c:
* gst/mxf/mxfdms1.h:
* gst/mxf/mxfmpeg.h:
* gst/mxf/mxftypes.h:
Cleanup of the includes.
2008-12-22 10:14:35 +00:00
Sebastian Dröge
083d8c7018 gst/mxf/: Add mxf_metadata_generic_sound_essence_descriptor_set_caps() to set rate and channels and use this for all ...
Original commit message from CVS:
* gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps),
(mxf_aes3_create_caps):
* gst/mxf/mxfalaw.c: (mxf_alaw_create_caps):
* gst/mxf/mxfd10.c: (mxf_d10_create_caps):
* gst/mxf/mxfdemux.c:
* gst/mxf/mxfmetadata.c: (mxf_metadata_source_package_resolve),
(mxf_metadata_generic_picture_essence_descriptor_set_caps),
(mxf_metadata_generic_sound_essence_descriptor_set_caps):
* gst/mxf/mxfmetadata.h:
* gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps):
Add mxf_metadata_generic_sound_essence_descriptor_set_caps() to
set rate and channels and use this for all sound essence.
Give some debug output when setting picture essence caps with
invalid descriptor values.
Fix height calculation from the frame layout a bit more and
add a TODO to check if it's really correct now or if it needs
more fixing (especially, does the framerate need adjustments?).
2008-12-19 10:06:24 +00:00
Sebastian Dröge
ecc0e9221f gst/mxf/: Add support for VC-3 (aka DNxHD essence, see SMPTE 2019-4).
Original commit message from CVS:
* gst/mxf/Makefile.am:
* gst/mxf/mxf.c: (plugin_init):
* gst/mxf/mxfvc3.c: (mxf_is_vc3_essence_track),
(mxf_vc3_handle_essence_element), (mxf_vc3_create_caps),
(mxf_vc3_init):
* gst/mxf/mxfvc3.h:
Add support for VC-3 (aka DNxHD essence, see SMPTE 2019-4).
This is untested because of lack of sample files but should
work fine.
2008-12-18 17:49:08 +00:00
Sebastian Dröge
b050e06170 gst/mxf/mxfdemux.c: In push mode skip the run in again if we get buffers with an offset before the run in. This can h...
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_chain):
In push mode skip the run in again if we get buffers with
an offset before the run in. This can happen on seeks for example.
2008-12-17 12:06:43 +00:00
Sebastian Dröge
5587f91210 gst/mxf/: Implement an essence element handling registry and use this instead of an hardcoded, large if-then-else block.
Original commit message from CVS:
* gst/mxf/mxfaes-bwf.c: (mxf_is_aes_bwf_essence_track),
(mxf_bwf_handle_essence_element),
(mxf_aes3_handle_essence_element), (mxf_bwf_create_caps),
(mxf_aes3_create_caps), (mxf_aes_bwf_create_caps),
(mxf_aes_bwf_init):
* gst/mxf/mxfaes-bwf.h:
* gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track),
(mxf_alaw_handle_essence_element), (mxf_alaw_create_caps),
(mxf_alaw_init):
* gst/mxf/mxfalaw.h:
* gst/mxf/mxfd10.c: (mxf_is_d10_essence_track),
(mxf_d10_picture_handle_essence_element),
(mxf_d10_sound_handle_essence_element), (mxf_d10_create_caps),
(mxf_d10_init):
* gst/mxf/mxfd10.h:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_handle_generic_container_essence_element):
* gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track),
(mxf_dv_dif_handle_essence_element), (mxf_dv_dif_create_caps),
(mxf_dv_dif_init):
* gst/mxf/mxfdv-dif.h:
* gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track),
(mxf_jpeg2000_handle_essence_element), (mxf_jpeg2000_create_caps),
(mxf_jpeg2000_init):
* gst/mxf/mxfjpeg2000.h:
* gst/mxf/mxfmpeg.c: (mxf_is_mpeg_essence_track),
(mxf_mpeg_video_handle_essence_element),
(mxf_mpeg_audio_handle_essence_element), (mxf_mpeg_es_create_caps),
(mxf_mpeg_create_caps), (mxf_mpeg_init):
* gst/mxf/mxfmpeg.h:
* gst/mxf/mxfparse.c: (mxf_essence_element_handler_register),
(mxf_essence_element_handler_find):
* gst/mxf/mxfparse.h:
* gst/mxf/mxfup.c: (mxf_is_up_essence_track),
(mxf_up_handle_essence_element), (mxf_up_rgba_create_caps),
(mxf_up_create_caps), (mxf_up_init):
* gst/mxf/mxfup.h:
Implement an essence element handling registry and use this instead
of an hardcoded, large if-then-else block.
2008-12-16 12:30:34 +00:00
Sebastian Dröge
1eeb0a3a10 Add initial documentation for the MXF plugin and mxfdemux.
Original commit message from CVS:
* docs/plugins/Makefile.am:
* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
* docs/plugins/gst-plugins-bad-plugins-sections.txt:
* docs/plugins/gst-plugins-bad-plugins.args:
* docs/plugins/gst-plugins-bad-plugins.hierarchy:
* docs/plugins/gst-plugins-bad-plugins.interfaces:
* docs/plugins/gst-plugins-bad-plugins.prerequisites:
* docs/plugins/inspect/plugin-ladspa.xml:
* docs/plugins/inspect/plugin-musepack.xml:
* docs/plugins/inspect/plugin-mxf.xml:
* gst/mxf/mxfdemux.c:
* gst/mxf/mxfdemux.h:
Add initial documentation for the MXF plugin and mxfdemux.
2008-12-16 08:35:05 +00:00
Sebastian Dröge
10b91ac098 gst/mxf/: Rename MXFMetadataBase methods to reflect that they belong to
Original commit message from CVS:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_resolve_references):
* gst/mxf/mxfmetadata.c: (mxf_metadata_base_resolve_default),
(mxf_metadata_base_class_init), (mxf_metadata_base_parse),
(mxf_metadata_base_resolve), (mxf_metadata_new),
(mxf_metadata_preface_resolve),
(mxf_metadata_content_storage_resolve),
(mxf_metadata_essence_container_data_resolve),
(mxf_metadata_generic_package_resolve),
(mxf_metadata_source_package_resolve),
(mxf_metadata_track_resolve), (mxf_metadata_sequence_resolve),
(mxf_metadata_dm_segment_resolve),
(mxf_metadata_generic_descriptor_resolve),
(mxf_metadata_multiple_descriptor_resolve):
* gst/mxf/mxfmetadata.h:
Rename MXFMetadataBase methods to reflect that they belong to
MXFMetadataBase and not MXFMetadata.
2008-12-16 08:21:29 +00:00
Sebastian Dröge
425fdc1664 gst/mxf/: Return FALSE when parsing a metadata tag failed.
Original commit message from CVS:
* gst/mxf/mxfaes-bwf.c:
(mxf_metadata_wave_audio_essence_descriptor_handle_tag),
(mxf_metadata_aes3_audio_essence_descriptor_handle_tag):
* gst/mxf/mxfmetadata.c:
(mxf_metadata_multiple_descriptor_handle_tag):
Return FALSE when parsing a metadata tag failed.
Remove some useless return value assignments.
2008-12-15 18:12:26 +00:00
Sebastian Dröge
bc93b81dd5 gst/mxf/: Convert the structural metadata to GstMiniObjects to make a lot of code easier and to make everything bette...
Original commit message from CVS:
* gst/mxf/Makefile.am:
* gst/mxf/mxf.c: (plugin_init):
* gst/mxf/mxfaes-bwf.c:
(mxf_metadata_wave_audio_essence_descriptor_handle_tag),
(mxf_metadata_wave_audio_essence_descriptor_init),
(mxf_metadata_wave_audio_essence_descriptor_class_init),
(mxf_metadata_aes3_audio_essence_descriptor_finalize),
(mxf_metadata_aes3_audio_essence_descriptor_handle_tag),
(mxf_metadata_aes3_audio_essence_descriptor_init),
(mxf_metadata_aes3_audio_essence_descriptor_class_init),
(mxf_is_aes_bwf_essence_track), (mxf_bwf_create_caps),
(mxf_aes3_create_caps), (mxf_aes_bwf_create_caps),
(mxf_aes_bwf_init):
* gst/mxf/mxfaes-bwf.h:
* gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track),
(mxf_alaw_create_caps), (mxf_alaw_init):
* gst/mxf/mxfalaw.h:
* gst/mxf/mxfd10.c: (mxf_is_d10_essence_track),
(mxf_d10_create_caps), (mxf_d10_init):
* gst/mxf/mxfd10.h:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
(gst_mxf_demux_handle_header_metadata_resolve_references),
(gst_mxf_demux_find_package), (gst_mxf_demux_choose_package),
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_handle_metadata),
(gst_mxf_demux_handle_generic_container_essence_element),
(gst_mxf_demux_handle_klv_packet), (gst_mxf_demux_src_query):
* gst/mxf/mxfdemux.h:
* gst/mxf/mxfdv-dif.c: (mxf_is_dv_dif_essence_track),
(mxf_dv_dif_create_caps), (mxf_dv_dif_init):
* gst/mxf/mxfdv-dif.h:
* gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track),
(mxf_jpeg2000_create_caps), (mxf_jpeg2000_init):
* gst/mxf/mxfjpeg2000.h:
* gst/mxf/mxfmetadata.c: (mxf_metadata_base_finalize),
(mxf_metadata_base_handle_tag), (mxf_metadata_base_resolve),
(mxf_metadata_base_init), (mxf_metadata_base_class_init),
(mxf_metadata_parse), (mxf_metadata_resolve),
(mxf_metadata_handle_tag), (mxf_metadata_class_init),
(mxf_metadata_init), (mxf_metadata_init_types),
(mxf_metadata_register), (mxf_metadata_new),
(mxf_metadata_preface_finalize), (mxf_metadata_preface_handle_tag),
(mxf_metadata_preface_resolve), (mxf_metadata_preface_init),
(mxf_metadata_preface_class_init),
(mxf_metadata_identification_finalize),
(mxf_metadata_identification_handle_tag),
(mxf_metadata_identification_init),
(mxf_metadata_identification_class_init),
(mxf_metadata_content_storage_finalize),
(mxf_metadata_content_storage_handle_tag),
(mxf_metadata_content_storage_resolve),
(mxf_metadata_content_storage_init),
(mxf_metadata_content_storage_class_init),
(mxf_metadata_essence_container_data_handle_tag),
(mxf_metadata_essence_container_data_resolve),
(mxf_metadata_essence_container_data_init),
(mxf_metadata_essence_container_data_class_init),
(mxf_metadata_generic_package_finalize),
(mxf_metadata_generic_package_handle_tag),
(mxf_metadata_generic_package_resolve),
(mxf_metadata_generic_package_init),
(mxf_metadata_generic_package_class_init),
(mxf_metadata_material_package_resolve),
(mxf_metadata_material_package_init),
(mxf_metadata_material_package_class_init),
(mxf_metadata_source_package_finalize),
(mxf_metadata_source_package_handle_tag),
(mxf_metadata_source_package_resolve),
(mxf_metadata_source_package_init),
(mxf_metadata_source_package_class_init),
(mxf_metadata_track_finalize), (mxf_metadata_track_handle_tag),
(mxf_metadata_track_resolve), (mxf_metadata_track_init),
(mxf_metadata_track_class_init),
(mxf_metadata_track_identifier_parse),
(mxf_metadata_timeline_track_handle_tag),
(mxf_metadata_timeline_track_init),
(mxf_metadata_timeline_track_class_init),
(mxf_metadata_event_track_handle_tag),
(mxf_metadata_event_track_init),
(mxf_metadata_event_track_class_init),
(mxf_metadata_static_track_init),
(mxf_metadata_static_track_class_init),
(mxf_metadata_sequence_finalize),
(mxf_metadata_sequence_handle_tag),
(mxf_metadata_sequence_resolve), (mxf_metadata_sequence_init),
(mxf_metadata_sequence_class_init),
(mxf_metadata_structural_component_handle_tag),
(mxf_metadata_structural_component_init),
(mxf_metadata_structural_component_class_init),
(mxf_metadata_timecode_component_handle_tag),
(mxf_metadata_timecode_component_init),
(mxf_metadata_timecode_component_class_init),
(mxf_metadata_source_clip_handle_tag),
(mxf_metadata_source_clip_resolve),
(mxf_metadata_source_clip_init),
(mxf_metadata_source_clip_class_init),
(mxf_metadata_dm_source_clip_finalize),
(mxf_metadata_dm_source_clip_handle_tag),
(mxf_metadata_dm_source_clip_init),
(mxf_metadata_dm_source_clip_class_init),
(mxf_metadata_dm_segment_finalize),
(mxf_metadata_dm_segment_handle_tag),
(mxf_metadata_dm_segment_resolve), (mxf_metadata_dm_segment_init),
(mxf_metadata_dm_segment_class_init),
(mxf_metadata_generic_descriptor_finalize),
(mxf_metadata_generic_descriptor_handle_tag),
(mxf_metadata_generic_descriptor_resolve),
(mxf_metadata_generic_descriptor_init),
(mxf_metadata_generic_descriptor_class_init),
(mxf_metadata_file_descriptor_handle_tag),
(mxf_metadata_file_descriptor_init),
(mxf_metadata_file_descriptor_class_init),
(mxf_metadata_generic_picture_essence_descriptor_handle_tag),
(mxf_metadata_generic_picture_essence_descriptor_init),
(mxf_metadata_generic_picture_essence_descriptor_class_init),
(mxf_metadata_generic_picture_essence_descriptor_set_caps),
(mxf_metadata_generic_sound_essence_descriptor_handle_tag),
(mxf_metadata_generic_sound_essence_descriptor_init),
(mxf_metadata_generic_sound_essence_descriptor_class_init),
(mxf_metadata_cdci_picture_essence_descriptor_handle_tag),
(mxf_metadata_cdci_picture_essence_descriptor_init),
(mxf_metadata_cdci_picture_essence_descriptor_class_init),
(mxf_metadata_rgba_picture_essence_descriptor_finalize),
(mxf_metadata_rgba_picture_essence_descriptor_handle_tag),
(mxf_metadata_rgba_picture_essence_descriptor_init),
(mxf_metadata_rgba_picture_essence_descriptor_class_init),
(mxf_metadata_generic_data_essence_descriptor_handle_tag),
(mxf_metadata_generic_data_essence_descriptor_init),
(mxf_metadata_generic_data_essence_descriptor_class_init),
(mxf_metadata_multiple_descriptor_finalize),
(mxf_metadata_multiple_descriptor_handle_tag),
(mxf_metadata_multiple_descriptor_resolve),
(mxf_metadata_multiple_descriptor_init),
(mxf_metadata_multiple_descriptor_class_init),
(mxf_metadata_locator_init), (mxf_metadata_locator_class_init),
(mxf_metadata_text_locator_finalize),
(mxf_metadata_text_locator_handle_tag),
(mxf_metadata_text_locator_init),
(mxf_metadata_text_locator_class_init),
(mxf_metadata_network_locator_finalize),
(mxf_metadata_network_locator_handle_tag),
(mxf_metadata_network_locator_init),
(mxf_metadata_network_locator_class_init):
* gst/mxf/mxfmetadata.h:
* gst/mxf/mxfmpeg.c:
(mxf_metadata_mpeg_video_descriptor_handle_tag),
(mxf_metadata_mpeg_video_descriptor_init),
(mxf_metadata_mpeg_video_descriptor_class_init),
(mxf_is_mpeg_essence_track), (mxf_mpeg_es_create_caps),
(mxf_mpeg_create_caps), (mxf_mpeg_init):
* gst/mxf/mxfmpeg.h:
* gst/mxf/mxfparse.c: (mxf_index_table_segment_parse),
(mxf_local_tag_add_to_hash_table):
* gst/mxf/mxfparse.h:
* gst/mxf/mxftypes.h:
* gst/mxf/mxfup.c: (mxf_is_up_essence_track), (mxf_up_create_caps),
(mxf_up_init):
* gst/mxf/mxfup.h:
Convert the structural metadata to GstMiniObjects to make a lot of
code easier and to make everything better extensible.
Add a "registry" for metadata handlers to improve extensibility even
more and to remove metadata type specifics from mxfdemux.
Clean up a lot of parts and add some more NULL checks.
2008-12-15 17:27:00 +00:00
Sebastian Dröge
a8ffb0e71d gst/mxf/mxfdemux.c: Add a generic handler for descriptive metadata so we can get some debug output and let users file...
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_descriptive_metadata),
(gst_mxf_demux_handle_klv_packet):
Add a generic handler for descriptive metadata so we can get some
debug output and let users file bugs for unsupport descriptive
metadata schemes.
2008-12-13 08:06:33 +00:00
Sebastian Dröge
c94b1bd2de gst/mxf/: Major update of the TODO lists. There's still much to do.
Original commit message from CVS:
* gst/mxf/mxfaes-bwf.c:
* gst/mxf/mxfalaw.c: (mxf_alaw_create_caps):
* gst/mxf/mxfdemux.c:
* gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps):
* gst/mxf/mxfjpeg2000.c:
* gst/mxf/mxfmpeg.c:
* gst/mxf/mxfup.c:
Major update of the TODO lists. There's still much to do.
2008-12-12 10:29:31 +00:00
Sebastian Dröge
1fe82925f5 gst/mxf/: Implement parsing of Event Tracks, Static Tracks, DM Segments and DM Source Clips as a preparation for desc...
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_handle_metadata_track),
(gst_mxf_demux_handle_header_metadata_resolve_references),
(gst_mxf_demux_handle_metadata):
* gst/mxf/mxfparse.c: (mxf_metadata_track_parse),
(mxf_metadata_structural_component_parse),
(mxf_metadata_structural_component_reset):
* gst/mxf/mxfparse.h:
* gst/mxf/mxftypes.h:
Implement parsing of Event Tracks, Static Tracks, DM Segments
and DM Source Clips as a preparation for descriptive metadata
support. Next step is to implement SMPTE S380M, "Descriptive
Metadata Scheme-1".
2008-12-11 14:35:08 +00:00
Sebastian Dröge
db08161b6d gst/mxf/mxfjpeg2000.c: Implement detection of the colorspace used by the
Original commit message from CVS:
* gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps):
Implement detection of the colorspace used by the
JPEG2000 codestream. XYZ colorspace isn't supported by
our decoders yet unfortunately.
2008-12-09 13:44:45 +00:00
Sebastian Dröge
d23484c483 gst/mxf/mxfparse.c: All frame layout values except 0 are for interlaced video, not only 1 and 2.
Original commit message from CVS:
* gst/mxf/mxfparse.c:
(mxf_metadata_generic_picture_essence_descriptor_set_caps):
All frame layout values except 0 are for interlaced video,
not only 1 and 2.
2008-12-08 15:46:13 +00:00
Sebastian Dröge
204cd06fbe gst/mxf/: Remove the concept of "final" metadata, broken files have updated metadata in following partitions even if ...
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
(gst_mxf_demux_handle_primer_pack),
(gst_mxf_demux_handle_metadata_preface),
(gst_mxf_demux_handle_header_metadata_resolve_references),
(gst_mxf_demux_choose_package),
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_parse_footer_metadata),
(gst_mxf_demux_handle_klv_packet):
* gst/mxf/mxfdemux.h:
* gst/mxf/mxftypes.h:
Remove the concept of "final" metadata, broken files have updated
metadata in following partitions even if the current partition
is closed and complete.
If there's a second primer pack inside a partition ignore the second
one instead of throwing an error.
Store the type of a track (audio, video, timestamp, ...) inside the
track struct.
Post no-more-pads only once for a stream and not a second time
when switching the currently playing package.
When updating all streams make sure that we could select and find
a package instead of dereferencing NULL.
Allow descriptive metadata inside metadata parts of a file when
pulling the footer metadata too.
Only switch the currently playing package if a new one was chosen
and the metadata is in a resolved state. If the latter isn't true
postpone the switch until the metadata is resolved.
Pull the footer metadata directly after parsing the header partition
pack if it's not closed or not complete instead of waiting until
the next KLV packet.
2008-12-08 15:28:58 +00:00
Sebastian Dröge
d7a23866d2 gst/mxf/mxfup.c: Don't create a subbuffer, instead just change the buffer metadata of the input buffer.
Original commit message from CVS:
* gst/mxf/mxfup.c: (mxf_up_handle_essence_element):
Don't create a subbuffer, instead just change the buffer metadata
of the input buffer.
2008-12-08 13:48:46 +00:00
Sebastian Dröge
332e5ec000 gst/mxf/mxfdemux.c: Rename GstMXFPad to GstMXFDemuxPad to prevent name clashes with the GstMXFMuxPad in the muxer (la...
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_pad_finalize),
(gst_mxf_demux_pad_class_init), (gst_mxf_demux_pad_init),
(gst_mxf_demux_remove_pad), (gst_mxf_demux_reset_metadata),
(gst_mxf_demux_combine_flows),
(gst_mxf_demux_handle_header_metadata_resolve_references),
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_handle_generic_container_essence_element),
(gst_mxf_demux_pull_random_index_pack), (gst_mxf_demux_loop),
(gst_mxf_demux_src_query):
Rename GstMXFPad to GstMXFDemuxPad to prevent name clashes
with the GstMXFMuxPad in the muxer (later).
Pull the random index pack only directly after skipping the run
in and don't allocate an array for it if parsing it failed.
2008-12-07 20:12:33 +00:00
Sebastian Dröge
3580384530 gst/mxf/mxfd10.c: Use the mapping data for storing the channel count and the width instead of parsing caps for every ...
Original commit message from CVS:
* gst/mxf/mxfd10.c: (mxf_d10_sound_handle_essence_element),
(mxf_d10_create_caps):
Use the mapping data for storing the channel count and the
width instead of parsing caps for every buffer.
2008-12-07 18:52:54 +00:00
Sebastian Dröge
f6e81c84e9 gst/mxf/mxfup.c: Handle the image start and end offsets, otherwise we output too large image buffers.
Original commit message from CVS:
* gst/mxf/mxfup.c: (mxf_up_handle_essence_element),
(mxf_up_rgba_create_caps):
Handle the image start and end offsets, otherwise we output
too large image buffers.
2008-12-07 18:39:41 +00:00
Sebastian Dröge
8932df4eef gst/mxf/mxfmpeg.c: Set codec name tags for the MPEG audio essence.
Original commit message from CVS:
* gst/mxf/mxfmpeg.c: (mxf_mpeg_es_create_caps):
Set codec name tags for the MPEG audio essence.
2008-12-07 17:57:13 +00:00
Sebastian Dröge
abcc855497 gst/mxf/: Add initial support for uncompressed video essence (SMPTE S384M).
Original commit message from CVS:
* gst/mxf/Makefile.am:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_update_streams):
* gst/mxf/mxftypes.h:
* gst/mxf/mxfup.c: (mxf_is_up_essence_track),
(mxf_up_handle_essence_element), (mxf_up_rgba_create_caps),
(mxf_up_create_caps):
* gst/mxf/mxfup.h:
Add initial support for uncompressed video essence (SMPTE S384M).
* gst/mxf/mxfparse.c:
(mxf_metadata_rgba_picture_essence_descriptor_handle_tag),
(mxf_metadata_rgba_picture_essence_descriptor_reset):
Fix parsing of the RGBA descriptor and add support for parsing
the pixel layout.
2008-12-07 17:16:29 +00:00
Sebastian Dröge
e3f042b99e gst/mxf/mxfdemux.c: The previous partition field of the partition is relative to the current partition and not to the...
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_parse_footer_metadata):
The previous partition field of the partition is relative
to the current partition and not to the offset of the header
partition.
2008-12-06 20:46:46 +00:00
Sebastian Dröge
f4cb76e92d gst/mxf/mxfd10.c: Document decoding of the AES3 data and also skip the 32 bit header in the beginning of every buffer...
Original commit message from CVS:
* gst/mxf/mxfd10.c: (mxf_d10_sound_handle_essence_element):
Document decoding of the AES3 data and also skip the 32 bit
header in the beginning of every buffer, otherwise we get
one broken audio channel.
2008-12-06 19:46:05 +00:00
Sebastian Dröge
6f15343df1 gst/mxf/: Implement parsing of the generic data essence descriptor.
Original commit message from CVS:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
(gst_mxf_demux_handle_metadata_generic_data_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_generic_data_essence_descriptor_handle_tag),
(mxf_metadata_generic_data_essence_descriptor_reset):
* gst/mxf/mxfparse.h:
* gst/mxf/mxftypes.h:
Implement parsing of the generic data essence descriptor.
2008-12-05 12:26:02 +00:00
Sebastian Dröge
278604dfa1 gst/mxf/mxfdemux.c: Generalize some lines of codes that are more or less the same by a macro.
Original commit message from CVS:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_resolve_references):
Generalize some lines of codes that are more or less the same
by a macro.
2008-12-05 10:32:55 +00:00
Sebastian Dröge
b52069748f gst/mxf/: Coding style fixes.
Original commit message from CVS:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_resolve_references):
* gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps):
* gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps):
Coding style fixes.
* gst/mxf/mxfmpeg.c: (mxf_mpeg_audio_handle_essence_element),
(mxf_mpeg_es_create_caps), (mxf_mpeg_create_caps):
Add support for MPEG, AC3, DTS audio.
2008-12-04 13:28:45 +00:00
Sebastian Dröge
462980ec57 gst/mxf/mxfdemux.c: Ignore zero sized essence elements. They're often inserted to fulfill the streaming requirements.
Original commit message from CVS:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_generic_container_essence_element):
Ignore zero sized essence elements. They're often inserted
to fulfill the streaming requirements.
2008-12-04 09:26:25 +00:00
Sebastian Dröge
fff48b08f6 gst/mxf/mxfparse.c: Fix setting of the height/width and PAR of video streams.
Original commit message from CVS:
* gst/mxf/mxfparse.c:
(mxf_metadata_generic_picture_essence_descriptor_set_caps):
Fix setting of the height/width and PAR of video streams.
2008-12-04 08:50:48 +00:00
Sebastian Dröge
8201937c54 gst/mxf/: Add support for SMPTE D10 essence (SMPTE 386M).
Original commit message from CVS:
* gst/mxf/Makefile.am:
* gst/mxf/mxfd10.c: (mxf_is_d10_essence_track),
(mxf_d10_picture_handle_essence_element),
(mxf_d10_sound_handle_essence_element), (mxf_d10_create_caps):
* gst/mxf/mxfd10.h:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_update_streams):
Add support for SMPTE D10 essence (SMPTE 386M).
* gst/mxf/mxfparse.c:
(mxf_metadata_generic_picture_essence_descriptor_set_caps):
Don't set width/height and PAR on the caps as those values are
wrong for most files (height is sometimes the height of a field
and aspect ratio is some random value).
* gst/mxf/mxfaes-bwf.c: (mxf_bwf_create_caps),
(mxf_aes3_create_caps):
Fix calculation of block align if it isn't set in the descriptor.
2008-12-04 08:37:18 +00:00
Sebastian Dröge
7f61ced7e6 gst/mxf/: Add support for AES3 audio (SMPTE 382M).
Original commit message from CVS:
* gst/mxf/mxfaes-bwf.c:
(mxf_metadata_aes3_audio_essence_descriptor_handle_tag),
(mxf_metadata_aes3_audio_essence_descriptor_reset),
(mxf_aes3_handle_essence_element), (mxf_bwf_create_caps),
(mxf_aes3_create_caps), (mxf_aes_bwf_create_caps):
* gst/mxf/mxfaes-bwf.h:
* gst/mxf/mxfdemux.c: (gst_mxf_demux_reset_metadata),
(gst_mxf_demux_handle_metadata_aes3_audio_essence_descriptor),
(gst_mxf_demux_handle_header_metadata_resolve_references),
(gst_mxf_demux_handle_metadata):
* gst/mxf/mxfdemux.h:
Add support for AES3 audio (SMPTE 382M).
* gst/mxf/mxfdv-dif.c: (mxf_dv_dif_create_caps):
* gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps):
Fix coding style.
2008-12-03 16:08:28 +00:00
Sebastian Dröge
bc1fdfd0bd gst/mxf/mxfdemux.c: Improve debugging a bit.
Original commit message from CVS:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_generic_container_essence_element):
Improve debugging a bit.
2008-12-03 13:17:41 +00:00
Sebastian Dröge
19ae0cf61d gst/mxf/mxfparse.c: Remove FIXME, zero-ULs and UMIDs are really invalid and we can use them as "unset" value.
Original commit message from CVS:
* gst/mxf/mxfparse.c:
Remove FIXME, zero-ULs and UMIDs are really invalid and we can
use them as "unset" value.
2008-12-03 10:15:27 +00:00
Sebastian Dröge
399f560eea gst/mxf/mxfdemux.c: Use a single "track_%u" src pad template and use the track ID of the playback package for the pad...
Original commit message from CVS:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_update_streams),
(gst_mxf_demux_base_init):
Use a single "track_%u" src pad template and use the track ID
of the playback package for the pad name instead of the track ID
of the source package, as the latter could be the same for
more than one track if they're in different packages.
2008-12-03 08:04:38 +00:00
Sebastian Dröge
0818d7b41d gst/mxf/mxfjpeg2000.c: Use new image/x-jpc caps for the raw JPEG2000 codestream.
Original commit message from CVS:
* gst/mxf/mxfjpeg2000.c: (mxf_jpeg2000_create_caps):
Use new image/x-jpc caps for the raw JPEG2000 codestream.
For now assume sRGB as colorspace, has to be read from the descriptor
somehow later.
2008-12-01 15:50:40 +00:00
Sebastian Dröge
65009ed81b gst/mxf/: Add the codec name, and if possible the avg bitrate, to the pad's taglist.
Original commit message from CVS:
* 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 15:24:37 +00:00
Sebastian Dröge
cffc0f9207 gst/mxf/mxfdemux.c: If the preface references a primary package use this as the default playback package unless one w...
Original commit message from CVS:
* 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-12-01 14:25:19 +00:00
Sebastian Dröge
1d57f71709 gst/mxf/mxfdemux.c: If there's no descriptor for the track in the track's source package and there's a single descrip...
Original commit message from CVS:
* 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 17:58:32 +00:00
Sebastian Dröge
d1242d04a1 gst/mxf/: Some random cleanup.
Original commit message from CVS:
* gst/mxf/mxfalaw.c: (mxf_is_alaw_essence_track):
* gst/mxf/mxfalaw.h:
* gst/mxf/mxfdemux.c:
(gst_mxf_demux_handle_header_metadata_update_streams):
* gst/mxf/mxfjpeg2000.c: (mxf_is_jpeg2000_essence_track):
* gst/mxf/mxfjpeg2000.h:
* gst/mxf/mxfmpeg.c: (mxf_is_mpeg_essence_track),
(mxf_mpeg_es_create_caps), (mxf_mpeg_create_caps):
* gst/mxf/mxfmpeg.h:
Some random cleanup.
2008-11-30 17:42:30 +00:00
Sebastian Dröge
c6d653d945 gst/mxf/: Add property to select the top-level source package or material package that should be used for playback.
Original commit message from CVS:
* 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 17:26:55 +00:00
Sebastian Dröge
2657c73024 gst/mxf/mxfdemux.c: Make sure that demux->offset has the correct value before calling any gst_mxf_demux_handle_* func...
Original commit message from CVS:
* 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 16:21:42 +00:00
Sebastian Dröge
8128aef461 gst/mxf/: Set the correct MPEG video version if possible and add support for MPEG4 video, including codec_data.
Original commit message from CVS:
* 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-30 14:12:04 +00:00
Sebastian Dröge
70281aa4e4 gst/mxf/: Add initial support for JPEG2000 encoded video essence.
Original commit message from CVS:
* 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 20:25:06 +00:00
Sebastian Dröge
358b472aab gst/mxf/mxfdemux.c: Only try to pull the random index pack at the end of file one time and not for every single packe...
Original commit message from CVS:
* 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 18:55:01 +00:00
Sebastian Dröge
e268611ed8 gst/mxf/: Add support for A-Law encoded audio essence (SMPTE 388M and 382M).
Original commit message from CVS:
* 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 18:13:30 +00:00
Sebastian Dröge
65587b80f5 gst/mxf/: Implement parsing of index table segments, which will later be used for seeking.
Original commit message from CVS:
* 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 11:24:24 +00:00
Sebastian Dröge
a926db34ad gst/mxf/: Implement parsing of the random index pack, which provides a seek table (including body sid) to the start o...
Original commit message from CVS:
* 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 16:26:39 +00:00
Sebastian Dröge
9e6654352e gst/mxf/: Add fundamental support for DV-DIF essence streams.
Original commit message from CVS:
* 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 10:09:53 +00:00
Sebastian Dröge
e3337c6868 gst/mxf/mxfdemux.*: Only try to pull the footer metadata once and not on every KLV packet if it failed before.
Original commit message from CVS:
* 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-27 08:49:08 +00:00
Sebastian Dröge
1f99f89e59 gst/mxf/mxfdemux.c: Properly combine flow returns of the source pads.
Original commit message from CVS:
* 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 11:30:28 +00:00
Sebastian Dröge
0be1824467 gst/mxf/: When memset'ing the descriptors to zeroes only touch the part of this descriptor, not it's parent type.
Original commit message from CVS:
* 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-26 10:37:34 +00:00
Sebastian Dröge
15afef8652 gst/mxf/: Set video dimensions and pixel aspect ratio on the caps.
Original commit message from CVS:
* 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 14:49:34 +00:00
Sebastian Dröge
4f365b391e gst/mxf/: Add initial parsing of RGBA descriptors.
Original commit message from CVS:
* 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 10:26:11 +00:00
Sebastian Dröge
fb8d2b901d gst/mxf/: Rewrite parsing of descriptors to go top-down instead of bottom-up which makes it possible to have the buff...
Original commit message from CVS:
* 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-25 09:38:26 +00:00
Sebastian Dröge
10adeafe87 gst/mxf/mxfdemux.c: Make sure to only output generic container essence elements for a track if the body SID of the su...
Original commit message from CVS:
* 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 11:31:27 +00:00
Sebastian Dröge
fa9ccc1eca gst/mxf/: Allow non-MXF KLV packets and just drop them instead of throwing an error and handle 9 byte product version...
Original commit message from CVS:
* 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-24 10:41:13 +00:00
Sebastian Dröge
63969842df gst/mxf/mxfdemux.c: Actually we support a length stored inside 8 bytes but it must be smaller than G_MAXUINT for GstB...
Original commit message from CVS:
* 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 11:25:30 +00:00
Sebastian Dröge
e1806aa1ad gst/mxf/: Some more format string fixes and usage of guint instead of gint where negative values don't make sense.
Original commit message from CVS:
* 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 14:51:06 +00:00
Sebastian Dröge
f336a478ba gst/mxf/: Use guint instead of guint64 or gsize for all buffer sizes and use correct format strings for them. Only lo...
Original commit message from CVS:
* 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 14:42:08 +00:00
Sebastian Dröge
e76ea1ca88 Add first version of an MXF demuxer. Currently it supports
Original commit message from CVS:
* 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-21 10:27:15 +00:00