Commit fedd6c2a authored by Sebastian Dröge's avatar Sebastian Dröge 🍵 Committed by GStreamer Marge Bot
Browse files

avidemux: Also detect 0x000001 as H264 byte-stream start code in codec_data

This works around some AVI files storing byte-stream data in the
codec_data. The previous workaround was only checking for
0x00000001 (4 bytes) instead of 0x000001 (3 bytes).

Part-of: <gstreamer/gst-plugins-good!1072>
parent ab6cb4c2
Pipeline #393842 waiting for manual action with stages
in 52 seconds
......@@ -1968,37 +1968,36 @@ gst_avi_demux_check_caps (GstAviDemux * avi, GstAviStream * stream,
gst_structure_remove_field (s, "palette_data");
return caps;
}
} else if (!gst_structure_has_name (s, "video/x-h264")) {
return caps;
}
GST_DEBUG_OBJECT (avi, "checking caps %" GST_PTR_FORMAT, caps);
/* some muxers put invalid bytestream stuff in h264 extra data */
val = gst_structure_get_value (s, "codec_data");
if (val && (buf = gst_value_get_buffer (val))) {
guint8 *data;
gint size;
GstMapInfo map;
gst_buffer_map (buf, &map, GST_MAP_READ);
data = map.data;
size = map.size;
if (size >= 4) {
guint32 h = GST_READ_UINT32_BE (data);
gst_buffer_unmap (buf, &map);
if (h == 0x01) {
/* can hardly be valid AVC codec data */
GST_DEBUG_OBJECT (avi,
"discarding invalid codec_data containing byte-stream");
/* so do not pretend to downstream that it is packetized avc */
gst_structure_remove_field (s, "codec_data");
/* ... but rather properly parsed bytestream */
gst_structure_set (s, "stream-format", G_TYPE_STRING, "byte-stream",
"alignment", G_TYPE_STRING, "au", NULL);
} else if (gst_structure_has_name (s, "video/x-h264")) {
GST_DEBUG_OBJECT (avi, "checking caps %" GST_PTR_FORMAT, caps);
/* some muxers put invalid bytestream stuff in h264 extra data */
val = gst_structure_get_value (s, "codec_data");
if (val && (buf = gst_value_get_buffer (val))) {
guint8 *data;
gint size;
GstMapInfo map;
gst_buffer_map (buf, &map, GST_MAP_READ);
data = map.data;
size = map.size;
if (size >= 4) {
guint32 h = GST_READ_UINT32_BE (data);
gst_buffer_unmap (buf, &map);
if (h == 0x01 || (h >> 8) == 0x01) {
/* can hardly be valid AVC codec data */
GST_DEBUG_OBJECT (avi,
"discarding invalid codec_data containing byte-stream");
/* so do not pretend to downstream that it is packetized avc */
gst_structure_remove_field (s, "codec_data");
/* ... but rather properly parsed bytestream */
gst_structure_set (s, "stream-format", G_TYPE_STRING, "byte-stream",
"alignment", G_TYPE_STRING, "au", NULL);
}
} else {
gst_buffer_unmap (buf, &map);
}
} else {
gst_buffer_unmap (buf, &map);
}
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment