Commit d8c2dd2d authored by Sreerenj Balachandran's avatar Sreerenj Balachandran Committed by Jan Schmidt
Browse files

h264parse: add initial support for MVC NAL units.

Initial support for MVC NAL units. It is only needed to propagate the
complete set of NAL units downstream at this time.

https://bugzilla.gnome.org/show_bug.cgi?id=696135

Signed-off-by: default avatarSreerenj Balachandran <sreerenj.balachandran@intel.com>
Signed-off-by: default avatarGwenole Beauchesne <gwenole.beauchesne@intel.com>
parent 919b93ae
...@@ -429,7 +429,7 @@ gst_h264_parser_store_nal (GstH264Parse * h264parse, guint id, ...@@ -429,7 +429,7 @@ gst_h264_parser_store_nal (GstH264Parse * h264parse, guint id,
GstBuffer *buf, **store; GstBuffer *buf, **store;
guint size = nalu->size, store_size; guint size = nalu->size, store_size;
if (naltype == GST_H264_NAL_SPS) { if (naltype == GST_H264_NAL_SPS || naltype == GST_H264_NAL_SUBSET_SPS) {
store_size = GST_H264_MAX_SPS_COUNT; store_size = GST_H264_MAX_SPS_COUNT;
store = h264parse->sps_nals; store = h264parse->sps_nals;
GST_DEBUG_OBJECT (h264parse, "storing sps %u", id); GST_DEBUG_OBJECT (h264parse, "storing sps %u", id);
...@@ -571,10 +571,16 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu) ...@@ -571,10 +571,16 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
nal_type, _nal_name (nal_type), nalu->size); nal_type, _nal_name (nal_type), nalu->size);
switch (nal_type) { switch (nal_type) {
case GST_H264_NAL_SUBSET_SPS:
if (!GST_H264_PARSE_STATE_VALID (h264parse, GST_H264_PARSE_STATE_GOT_SPS))
return FALSE;
goto process_sps;
case GST_H264_NAL_SPS: case GST_H264_NAL_SPS:
/* reset state, everything else is obsolete */ /* reset state, everything else is obsolete */
h264parse->state = 0; h264parse->state = 0;
process_sps:
pres = gst_h264_parser_parse_sps (nalparser, nalu, &sps, TRUE); pres = gst_h264_parser_parse_sps (nalparser, nalu, &sps, TRUE);
/* arranged for a fallback sps.id, so use that one and only warn */ /* arranged for a fallback sps.id, so use that one and only warn */
if (pres != GST_H264_PARSER_OK) { if (pres != GST_H264_PARSER_OK) {
...@@ -654,6 +660,7 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu) ...@@ -654,6 +660,7 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
case GST_H264_NAL_SLICE_DPB: case GST_H264_NAL_SLICE_DPB:
case GST_H264_NAL_SLICE_DPC: case GST_H264_NAL_SLICE_DPC:
case GST_H264_NAL_SLICE_IDR: case GST_H264_NAL_SLICE_IDR:
case GST_H264_NAL_SLICE_EXT:
/* expected state: got-sps|got-pps (valid picture headers) */ /* expected state: got-sps|got-pps (valid picture headers) */
h264parse->state &= GST_H264_PARSE_STATE_VALID_PICTURE_HEADERS; h264parse->state &= GST_H264_PARSE_STATE_VALID_PICTURE_HEADERS;
if (!GST_H264_PARSE_STATE_VALID (h264parse, if (!GST_H264_PARSE_STATE_VALID (h264parse,
...@@ -661,13 +668,15 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu) ...@@ -661,13 +668,15 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
return FALSE; return FALSE;
/* don't need to parse the whole slice (header) here */ /* don't need to parse the whole slice (header) here */
if (*(nalu->data + nalu->offset + 1) & 0x80) { if (*(nalu->data + nalu->offset + nalu->header_bytes) & 0x80) {
/* means first_mb_in_slice == 0 */ /* means first_mb_in_slice == 0 */
/* real frame data */ /* real frame data */
GST_DEBUG_OBJECT (h264parse, "first_mb_in_slice = 0"); GST_DEBUG_OBJECT (h264parse, "first_mb_in_slice = 0");
h264parse->frame_start = TRUE; h264parse->frame_start = TRUE;
} }
GST_DEBUG_OBJECT (h264parse, "frame start: %i", h264parse->frame_start); GST_DEBUG_OBJECT (h264parse, "frame start: %i", h264parse->frame_start);
if (nal_type == GST_H264_NAL_SLICE_EXT && !GST_H264_IS_MVC_NALU (nalu))
break;
{ {
GstH264SliceHdr slice; GstH264SliceHdr slice;
...@@ -764,8 +773,9 @@ gst_h264_parse_collect_nal (GstH264Parse * h264parse, const guint8 * data, ...@@ -764,8 +773,9 @@ gst_h264_parse_collect_nal (GstH264Parse * h264parse, const guint8 * data,
* and also works with broken frame_num in NAL * and also works with broken frame_num in NAL
* (where spec-wise would fail) */ * (where spec-wise would fail) */
nal_type = nnalu.type; nal_type = nnalu.type;
complete = h264parse->picture_start && (nal_type >= GST_H264_NAL_SEI && complete = h264parse->picture_start && ((nal_type >= GST_H264_NAL_SEI &&
nal_type <= GST_H264_NAL_AU_DELIMITER); nal_type <= GST_H264_NAL_AU_DELIMITER) ||
(nal_type >= 14 && nal_type <= 18));
GST_LOG_OBJECT (h264parse, "next nal type: %d %s", nal_type, GST_LOG_OBJECT (h264parse, "next nal type: %d %s", nal_type,
_nal_name (nal_type)); _nal_name (nal_type));
...@@ -773,7 +783,7 @@ gst_h264_parse_collect_nal (GstH264Parse * h264parse, const guint8 * data, ...@@ -773,7 +783,7 @@ gst_h264_parse_collect_nal (GstH264Parse * h264parse, const guint8 * data,
|| nal_type == GST_H264_NAL_SLICE_DPA || nal_type == GST_H264_NAL_SLICE_DPA
|| nal_type == GST_H264_NAL_SLICE_IDR) && || nal_type == GST_H264_NAL_SLICE_IDR) &&
/* first_mb_in_slice == 0 considered start of frame */ /* first_mb_in_slice == 0 considered start of frame */
(nnalu.data[nnalu.offset + 1] & 0x80); (nnalu.data[nnalu.offset + nnalu.header_bytes] & 0x80);
GST_LOG_OBJECT (h264parse, "au complete: %d", complete); GST_LOG_OBJECT (h264parse, "au complete: %d", complete);
......
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