h264parse: also mind SEI position for config data insertion
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Wed, 1 Feb 2012 11:23:23 +0000 (12:23 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Wed, 1 Feb 2012 12:53:15 +0000 (13:53 +0100)
Fixes #668627.

gst/videoparsers/gsth264parse.c
gst/videoparsers/gsth264parse.h

index d5e34735890cb024ddf07ca3a1b249d43a19dd4c..182b00e92996ba2f8415b84946be25dbd37f64ff 100644 (file)
@@ -186,6 +186,7 @@ gst_h264_parse_reset_frame (GstH264Parse * h264parse)
   h264parse->picture_start = FALSE;
   h264parse->update_caps = FALSE;
   h264parse->idr_pos = -1;
+  h264parse->sei_pos = -1;
   h264parse->keyframe = FALSE;
   h264parse->frame_start = FALSE;
   gst_adapter_clear (h264parse->frame_out);
@@ -504,6 +505,15 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
               GST_TIME_ARGS (h264parse->ts_trn_nb));
           break;
       }
+      /* mark SEI pos */
+      if (h264parse->sei_pos == -1) {
+        if (h264parse->format == GST_H264_PARSE_FORMAT_AVC)
+          h264parse->sei_pos = gst_adapter_available (h264parse->frame_out);
+        else
+          h264parse->sei_pos = nalu->offset - 4;
+        GST_DEBUG_OBJECT (h264parse, "marking SEI in frame at offset %d",
+            h264parse->sei_pos);
+      }
       break;
 
     case GST_H264_NAL_SLICE:
@@ -547,6 +557,12 @@ gst_h264_parse_process_nal (GstH264Parse * h264parse, GstH264NalUnit * nalu)
         GST_DEBUG_OBJECT (h264parse, "marking IDR in frame at offset %d",
             h264parse->idr_pos);
       }
+      /* if SEI preceeds (faked) IDR, then we have to insert config there */
+      if (h264parse->sei_pos >= 0 && h264parse->idr_pos > h264parse->sei_pos) {
+        h264parse->idr_pos = h264parse->sei_pos;
+        GST_DEBUG_OBJECT (h264parse, "moved IDR mark to SEI position %d",
+            h264parse->idr_pos);
+      }
       break;
     default:
       gst_h264_parser_parse_nal (nalparser, nalu);
index a97dfcb15ffba488d1d8dfcc64aaa6a4a3cec554..812ac4fb883f9438412e000dd175b2f2c64f228e 100644 (file)
@@ -98,7 +98,7 @@ struct _GstH264Parse
   /* frame parsing */
   /*guint last_nal_pos;*/
   /*guint next_sc_pos;*/
-  gint idr_pos;
+  gint idr_pos, sei_pos;
   gboolean update_caps;
   GstAdapter *frame_out;
   gboolean keyframe;