From 2dcdfe07f76dc7be5e8f9a3c8020d74d00dc1e3b Mon Sep 17 00:00:00 2001 From: Matej Knopp Date: Sat, 27 Jul 2013 18:10:22 +0200 Subject: [PATCH] qtdemux: Support H264 fourcc https://bugzilla.gnome.org/show_bug.cgi?id=704996 --- gst/isomp4/qtdemux.c | 29 +++++++++++++++++++++++++++++ gst/isomp4/qtdemux_fourcc.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c index d2874b2af1..75d69bb3d0 100644 --- a/gst/isomp4/qtdemux.c +++ b/gst/isomp4/qtdemux.c @@ -5388,6 +5388,12 @@ qtdemux_parse_node (GstQTDemux * qtdemux, GNode * node, const guint8 * buffer, } break; } + case FOURCC_H264: + { + GST_MEMDUMP_OBJECT (qtdemux, "H264", buffer, end - buffer); + qtdemux_parse_container (qtdemux, node, buffer + 0x56, end); + break; + } case FOURCC_avc1: { GST_MEMDUMP_OBJECT (qtdemux, "avc1", buffer, end - buffer); @@ -7300,6 +7306,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) gst_qtdemux_handle_esds (qtdemux, stream, esds, list); } else { switch (fourcc) { + case FOURCC_H264: case FOURCC_avc1: { gint len = QT_UINT32 (stsd_data) - 0x66; @@ -7340,6 +7347,27 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) break; } + case FOURCC_strf: + { + GstBuffer *buf; + + GST_DEBUG_OBJECT (qtdemux, "found strf codec_data in stsd"); + + /* First 4 bytes are the length of the atom, the next 4 bytes + * are the fourcc, next 40 bytes are BITMAPINFOHEADER, + * next 1 byte is the version, and the + * subsequent bytes are sequence parameter set like data. */ + gst_codec_utils_h264_caps_set_level_and_profile (stream->caps, + avc_data + 8 + 40 + 1, size - 1); + + buf = gst_buffer_new_and_alloc (size); + gst_buffer_fill (buf, 0, avc_data + 8 + 40, size); + gst_caps_set_simple (stream->caps, + "codec_data", GST_TYPE_BUFFER, buf, NULL); + gst_buffer_unref (buf); + + break; + } case FOURCC_btrt: { guint avg_bitrate, max_bitrate; @@ -10300,6 +10328,7 @@ qtdemux_video_caps (GstQTDemux * qtdemux, QtDemuxStream * stream, _codec ("Apple video"); caps = gst_caps_new_empty_simple ("video/x-apple-video"); break; + case GST_MAKE_FOURCC ('H', '2', '6', '4'): case GST_MAKE_FOURCC ('a', 'v', 'c', '1'): _codec ("H.264 / AVC"); caps = gst_caps_new_simple ("video/x-h264", diff --git a/gst/isomp4/qtdemux_fourcc.h b/gst/isomp4/qtdemux_fourcc.h index 027f357056..d3a972bb22 100644 --- a/gst/isomp4/qtdemux_fourcc.h +++ b/gst/isomp4/qtdemux_fourcc.h @@ -139,6 +139,8 @@ G_BEGIN_DECLS #define FOURCC_qtim GST_MAKE_FOURCC('q','t','i','m') #define FOURCC_drms GST_MAKE_FOURCC('d','r','m','s') #define FOURCC_drmi GST_MAKE_FOURCC('d','r','m','i') +#define FOURCC_H264 GST_MAKE_FOURCC('H','2','6','4') +#define FOURCC_strf GST_MAKE_FOURCC('s','t','r','f') #define FOURCC_avc1 GST_MAKE_FOURCC('a','v','c','1') #define FOURCC_avcC GST_MAKE_FOURCC('a','v','c','C') #define FOURCC_btrt GST_MAKE_FOURCC('b','t','r','t')