}
static GstH264ParserResult
+gst_h264_parser_parse_sei_unhandled_payload (GstH264NalParser * parser,
+ GstH264SEIUnhandledPayload * payload, NalReader * nr, guint payload_type,
+ guint payload_size)
+{
+ guint8 *data = NULL;
+ gint i;
+
+ payload->payloadType = payload_type;
+
+ data = g_malloc0 (payload_size);
+ for (i = 0; i < payload_size; ++i) {
+ READ_UINT8 (nr, data[i], 8);
+ }
+
+ payload->size = payload_size;
+ payload->data = data;
+
+ return GST_H264_PARSER_OK;
+
+error:
+ GST_WARNING ("error parsing \"Unhandled payload\"");
+ g_free (data);
+
+ return GST_H264_PARSER_ERROR;
+}
+
+static GstH264ParserResult
gst_h264_parser_parse_sei_message (GstH264NalParser * nalparser,
NalReader * nr, GstH264SEIMessage * sei)
{
&sei->payload.content_light_level, nr);
break;
default:
- /* Just consume payloadSize bytes, which does not account for
- emulation prevention bytes */
- if (!nal_reader_skip_long (nr, payload_size))
- goto error;
- res = GST_H264_PARSER_OK;
+ res = gst_h264_parser_parse_sei_unhandled_payload (nalparser,
+ &sei->payload.unhandled_payload, nr, sei->payloadType,
+ payload_size >> 3);
+ sei->payloadType = GST_H264_SEI_UNHANDLED_PAYLOAD;
break;
}
rud->data = NULL;
break;
}
+ case GST_H264_SEI_UNHANDLED_PAYLOAD:{
+ GstH264SEIUnhandledPayload *payload = &sei->payload.unhandled_payload;
+
+ g_free (payload->data);
+ payload->data = NULL;
+ payload->size = 0;
+ break;
+ }
default:
break;
}
* contains the 3D arrangement for stereoscopic 3D video (Since: 1.6)
* @GST_H264_SEI_MASTERING_DISPLAY_COLOUR_VOLUME: Mastering display colour volume information SEI message (D.2.29) (Since: 1.18)
* @GST_H264_SEI_CONTENT_LIGHT_LEVEL: Content light level information SEI message (D.2.31) (Since: 1.18)
+ * @GST_H264_SEI_UNHANDLED_PAYLOAD: Unhandled SEI message. This may or may not
+ * be defined by spec (Since 1.18)
* ...
*
* The type of SEI message.
GST_H264_SEI_MASTERING_DISPLAY_COLOUR_VOLUME = 137,
GST_H264_SEI_CONTENT_LIGHT_LEVEL = 144,
/* and more... */
+
+ /* Unhandled SEI type */
+ GST_H264_SEI_UNHANDLED_PAYLOAD = -1
} GstH264SEIPayloadType;
/**
typedef struct _GstH264FramePacking GstH264FramePacking;
typedef struct _GstH264MasteringDisplayColourVolume GstH264MasteringDisplayColourVolume;
typedef struct _GstH264ContentLightLevel GstH264ContentLightLevel;
+typedef struct _GstH264SEIUnhandledPayload GstH264SEIUnhandledPayload;
typedef struct _GstH264SEIMessage GstH264SEIMessage;
/**
guint16 max_pic_average_light_level;
};
+/**
+ * GstH264SEIUnhandledPayload:
+ * @payloadType: Payload type
+ * @data: payload raw data excluding payload type and payload size byte
+ * @size: the size of @data
+ *
+ * Contains unhandled SEI payload data. This SEI may or may not
+ * be defined by spec
+ *
+ * Since: 1.18
+ */
+struct _GstH264SEIUnhandledPayload
+{
+ guint payloadType;
+
+ guint8 *data;
+ guint size;
+};
+
struct _GstH264SEIMessage
{
GstH264SEIPayloadType payloadType;
GstH264FramePacking frame_packing;
GstH264MasteringDisplayColourVolume mastering_display_colour_volume;
GstH264ContentLightLevel content_light_level;
+ GstH264SEIUnhandledPayload unhandled_payload;
/* ... could implement more */
} payload;
};
break;
}
- default:
- GST_LOG_OBJECT (h264parse, "Unsupported payload type %u",
- sei.payloadType);
+ default:{
+ gint payload_type = sei.payloadType;
+
+ if (payload_type == GST_H264_SEI_UNHANDLED_PAYLOAD) {
+ GstH264SEIUnhandledPayload *unhandled =
+ &sei.payload.unhandled_payload;
+ payload_type = unhandled->payloadType;
+ }
+
+ GST_LOG_OBJECT (h264parse, "Unsupported payload type %d", payload_type);
break;
+ }
}
}
g_array_free (messages, TRUE);