h264parse: do not use _unchecked bytewriter variants to insert config
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 6 Apr 2012 12:23:53 +0000 (14:23 +0200)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 6 Apr 2012 12:35:56 +0000 (14:35 +0200)
.. since the bytewriter is explicitly created with non-fixed size to
allow (very much so expected) growth.

Partially reverts commit 20669d461a4953eb5ed01374d5ab628b4dc73b64 while
trying to keep (some?) compilers happy.

IIRC, the purpose of GstByteWriter in the first place was (at least)
being able to dump data without having to fuss with memory expansion
and size issues ...

Fixes #673485.

gst/h264parse/gsth264parse.c
gst/videoparsers/gsth264parse.c

index 29197371ecfce7bc3330dc38f056c1c62cab7e89..0db243469548e016462e78ce60767dbaa83d7b4a 100644 (file)
@@ -1728,9 +1728,10 @@ gst_h264_parse_push_buffer (GstH264Parse * h264parse, GstBuffer * buf)
           /* insert config NALs into AU */
           GstByteWriter bw;
           GstBuffer *codec_nal, *new_buf;
+          gboolean ok;
 
           gst_byte_writer_init_with_size (&bw, GST_BUFFER_SIZE (buf), FALSE);
-          gst_byte_writer_put_data_unchecked (&bw, GST_BUFFER_DATA (buf),
+          ok = gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (buf),
               h264parse->idr_offset);
           GST_DEBUG_OBJECT (h264parse, "- inserting SPS/PPS");
           for (i = 0; i < MAX_SPS_COUNT; i++) {
@@ -1739,7 +1740,7 @@ gst_h264_parse_push_buffer (GstH264Parse * h264parse, GstBuffer * buf)
               codec_nal = gst_buffer_copy (h264parse->sps_nals[i]);
               codec_nal =
                   gst_h264_parse_write_nal_prefix (h264parse, codec_nal);
-              gst_byte_writer_put_data_unchecked (&bw,
+              ok &= gst_byte_writer_put_data (&bw,
                   GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal));
               h264parse->last_report = timestamp;
             }
@@ -1750,12 +1751,12 @@ gst_h264_parse_push_buffer (GstH264Parse * h264parse, GstBuffer * buf)
               codec_nal = gst_buffer_copy (h264parse->pps_nals[i]);
               codec_nal =
                   gst_h264_parse_write_nal_prefix (h264parse, codec_nal);
-              gst_byte_writer_put_data_unchecked (&bw,
+              ok &= gst_byte_writer_put_data (&bw,
                   GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal));
               h264parse->last_report = timestamp;
             }
           }
-          gst_byte_writer_put_data_unchecked (&bw,
+          ok &= gst_byte_writer_put_data (&bw,
               GST_BUFFER_DATA (buf) + h264parse->idr_offset,
               GST_BUFFER_SIZE (buf) - h264parse->idr_offset);
           /* collect result and push */
@@ -1763,6 +1764,10 @@ gst_h264_parse_push_buffer (GstH264Parse * h264parse, GstBuffer * buf)
           gst_buffer_copy_metadata (new_buf, buf, GST_BUFFER_COPY_ALL);
           gst_buffer_unref (buf);
           buf = new_buf;
+          /* some result checking seems to make some compilers happy */
+          if (G_UNLIKELY (!ok)) {
+            GST_ERROR_OBJECT (h264parse, "failed to insert SPS/PPS");
+          }
         }
       }
     }
index 0c8455d49da552f37ad2dfe1581a27a78b681ab4..af0afac56c287b36f9e43309983a994e7e3962a7 100644 (file)
@@ -1489,17 +1489,18 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
           GstByteWriter bw;
           GstBuffer *new_buf;
           const gboolean bs = h264parse->format == GST_H264_PARSE_FORMAT_BYTE;
+          gboolean ok;
 
           gst_byte_writer_init_with_size (&bw, GST_BUFFER_SIZE (buffer), FALSE);
-          gst_byte_writer_put_data_unchecked (&bw, GST_BUFFER_DATA (buffer),
+          ok = gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (buffer),
               h264parse->idr_pos);
           GST_DEBUG_OBJECT (h264parse, "- inserting SPS/PPS");
           for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) {
             if ((codec_nal = h264parse->sps_nals[i])) {
               GST_DEBUG_OBJECT (h264parse, "inserting SPS nal");
-              gst_byte_writer_put_uint32_be_unchecked (&bw,
+              ok &= gst_byte_writer_put_uint32_be (&bw,
                   bs ? 1 : GST_BUFFER_SIZE (codec_nal));
-              gst_byte_writer_put_data_unchecked (&bw,
+              ok &= gst_byte_writer_put_data (&bw,
                   GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal));
               h264parse->last_report = new_ts;
             }
@@ -1507,14 +1508,14 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
           for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) {
             if ((codec_nal = h264parse->pps_nals[i])) {
               GST_DEBUG_OBJECT (h264parse, "inserting PPS nal");
-              gst_byte_writer_put_uint32_be_unchecked (&bw,
+              ok &= gst_byte_writer_put_uint32_be (&bw,
                   bs ? 1 : GST_BUFFER_SIZE (codec_nal));
-              gst_byte_writer_put_data_unchecked (&bw,
+              ok &= gst_byte_writer_put_data (&bw,
                   GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal));
               h264parse->last_report = new_ts;
             }
           }
-          gst_byte_writer_put_data_unchecked (&bw,
+          ok &= gst_byte_writer_put_data (&bw,
               GST_BUFFER_DATA (buffer) + h264parse->idr_pos,
               GST_BUFFER_SIZE (buffer) - h264parse->idr_pos);
           /* collect result and push */
@@ -1525,6 +1526,10 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
           GST_BUFFER_FLAG_UNSET (new_buf, GST_BUFFER_FLAG_DELTA_UNIT);
           gst_buffer_replace (&frame->buffer, new_buf);
           gst_buffer_unref (new_buf);
+          /* some result checking seems to make some compilers happy */
+          if (G_UNLIKELY (!ok)) {
+            GST_ERROR_OBJECT (h264parse, "failed to insert SPS/PPS");
+          }
         }
       }
       /* we pushed whatever we had */