summaryrefslogtreecommitdiffstats
path: root/gst/qtmux/gstqtmux.c
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2008-11-14 20:17:10 +0000
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2008-11-14 20:17:10 +0000
commitfd872d5f12daa80884b1202f7207a2f3eacb2764 (patch)
tree16a6e5b9cc9a51adb0067fa9fb2ec567ddfe46cc /gst/qtmux/gstqtmux.c
parent21683124da3e7387616facaa6b4f5e938dbc8d96 (diff)
downloadgst-plugins-bad-fd872d5f12daa80884b1202f7207a2f3eacb2764.tar.gz
gst-plugins-bad-fd872d5f12daa80884b1202f7207a2f3eacb2764.tar.bz2
gst-plugins-bad-fd872d5f12daa80884b1202f7207a2f3eacb2764.zip
gst/qtmux/: Cut detour in sample description extension construction.
Original commit message from CVS: * gst/qtmux/atoms.c: (build_esds_extension), (build_mov_aac_extension), (build_jp2h_extension), (build_codec_data_extension): * gst/qtmux/atoms.h: * gst/qtmux/fourcc.h: * gst/qtmux/gstqtmux.c: (gst_qt_mux_audio_sink_set_caps), (gst_qt_mux_video_sink_set_caps): * gst/qtmux/gstqtmuxmap.c: (gst_qt_mux_map_format_to_header): Cut detour in sample description extension construction. Also actually implement ISO JPEG2000 mj2 format.
Diffstat (limited to 'gst/qtmux/gstqtmux.c')
-rw-r--r--gst/qtmux/gstqtmux.c45
1 files changed, 31 insertions, 14 deletions
diff --git a/gst/qtmux/gstqtmux.c b/gst/qtmux/gstqtmux.c
index 7eaf730d..ab59b483 100644
--- a/gst/qtmux/gstqtmux.c
+++ b/gst/qtmux/gstqtmux.c
@@ -1150,7 +1150,6 @@ gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps)
AudioSampleEntry entry = { 0, };
AtomInfo *ext_atom = NULL;
gint constant_size = 0;
- guint esds_type = 0;
/* find stream data */
qtpad = (GstQTPad *) gst_pad_get_element_private (pad);
@@ -1208,7 +1207,9 @@ gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps)
entry.fourcc = FOURCC__mp3;
else {
entry.fourcc = FOURCC_mp4a;
- esds_type = ESDS_OBJECT_TYPE_MPEG1_P3;
+ ext_atom =
+ build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG1_P3,
+ ESDS_STREAM_TYPE_AUDIO, codec_data);
}
entry.samples_per_packet = 1152;
entry.bytes_per_sample = 2;
@@ -1218,7 +1219,6 @@ gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps)
case 4:
/* AAC */
entry.fourcc = FOURCC_mp4a;
- esds_type = ESDS_OBJECT_TYPE_MPEG4_P3;
if (!codec_data || GST_BUFFER_SIZE (codec_data) < 2)
GST_WARNING_OBJECT (qtmux, "no (valid) codec_data for AAC audio");
else {
@@ -1230,6 +1230,12 @@ gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps)
GST_WARNING_OBJECT (qtmux,
"non-LC AAC may not run well on (Apple) QuickTime/iTunes");
}
+ if (format == GST_QT_MUX_FORMAT_QT)
+ ext_atom = build_mov_aac_extension (qtpad->trak, codec_data);
+ else
+ ext_atom =
+ build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P3,
+ ESDS_STREAM_TYPE_AUDIO, codec_data);
break;
default:
break;
@@ -1306,9 +1312,6 @@ gst_qt_mux_audio_sink_set_caps (GstPad * pad, GstCaps * caps)
/* ok, set the pad info accordingly */
qtpad->fourcc = entry.fourcc;
qtpad->sample_size = constant_size;
- /* collect optional extensions */
- ext_atom = build_sample_entry_extension (qtpad->trak, qtmux->context->flavor,
- entry.fourcc, esds_type, codec_data);
atom_trak_set_audio_type (qtpad->trak, qtmux->context, &entry,
entry.sample_rate, ext_atom, constant_size);
@@ -1362,7 +1365,6 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
VisualSampleEntry entry = { 0, };
GstQTMuxFormat format;
AtomInfo *ext_atom = NULL;
- guint esds_type = 0;
gboolean sync = FALSE;
/* find stream data */
@@ -1382,12 +1384,16 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
/* required parts */
if (!gst_structure_get_int (structure, "width", &width) ||
- !gst_structure_get_int (structure, "height", &height) ||
- !gst_structure_get_fraction (structure, "framerate", &framerate_num,
- &framerate_den))
+ !gst_structure_get_int (structure, "height", &height))
goto refuse_caps;
/* optional */
+ depth = -1;
+ /* works as a default timebase */
+ framerate_num = 10000;
+ framerate_den = 1;
+ gst_structure_get_fraction (structure, "framerate", &framerate_num,
+ &framerate_den);
gst_structure_get_int (structure, "depth", &depth);
value = gst_structure_get_value (structure, "codec_data");
if (value != NULL)
@@ -1450,7 +1456,9 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
}
if (version) {
entry.fourcc = FOURCC_mp4v;
- esds_type = ESDS_OBJECT_TYPE_MPEG4_P2;
+ ext_atom =
+ build_esds_extension (qtpad->trak, ESDS_OBJECT_TYPE_MPEG4_P2,
+ ESDS_STREAM_TYPE_VISUAL, codec_data);
if (!codec_data)
GST_WARNING_OBJECT (qtmux, "no codec_data for MPEG4 video; "
"output might not play in Apple QuickTime (try global-headers?)");
@@ -1460,6 +1468,7 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
qtpad->is_out_of_order = TRUE;
if (!codec_data)
GST_WARNING_OBJECT (qtmux, "no codec_data in h264 caps");
+ ext_atom = build_codec_data_extension (FOURCC_avcC, codec_data);
} else if (strcmp (mimetype, "video/x-dv") == 0) {
gint version = 0;
gboolean pal = TRUE;
@@ -1491,6 +1500,17 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
} else if (strcmp (mimetype, "image/jpeg") == 0) {
entry.fourcc = FOURCC_jpeg;
sync = FALSE;
+ } else if (strcmp (mimetype, "image/x-j2c") == 0) {
+ guint32 fourcc;
+
+ entry.fourcc = FOURCC_mjp2;
+ sync = FALSE;
+ if (!gst_structure_get_fourcc (structure, "fourcc", &fourcc) ||
+ !(ext_atom =
+ build_jp2h_extension (qtpad->trak, width, height, fourcc))) {
+ GST_DEBUG_OBJECT (qtmux, "missing or invalid fourcc in jp2 caps");
+ goto refuse_caps;
+ }
} else if (strcmp (mimetype, "video/x-qt-part") == 0) {
guint32 fourcc;
@@ -1505,9 +1525,6 @@ gst_qt_mux_video_sink_set_caps (GstPad * pad, GstCaps * caps)
/* ok, set the pad info accordingly */
qtpad->fourcc = entry.fourcc;
qtpad->sync = sync;
- /* collect optional extensions */
- ext_atom = build_sample_entry_extension (qtpad->trak, qtmux->context->flavor,
- entry.fourcc, esds_type, codec_data);
atom_trak_set_video_type (qtpad->trak, qtmux->context, &entry, rate,
ext_atom);