avviddec: do not add 708 caption meta if already exists
authorAaron Boxer <aaron.boxer@collabora.com>
Thu, 28 Mar 2019 18:24:42 +0000 (14:24 -0400)
committerAaron Boxer <aaron.boxer@collabora.com>
Mon, 1 Apr 2019 21:11:36 +0000 (17:11 -0400)
(this is only used for CEA 708 raw data). another element
such as mpegvideoparse may have already added the meta.

ext/libav/gstavviddec.c

index 8c9a794..374bd9e 100644 (file)
@@ -1598,12 +1598,35 @@ gst_ffmpegviddec_video_frame (GstFFMpegVidDec * ffmpegdec,
     AVFrameSideData *side_data =
         av_frame_get_side_data (ffmpegdec->picture, AV_FRAME_DATA_A53_CC);
     if (side_data) {
-      GST_LOG_OBJECT (ffmpegdec, "Found CC of size %d", side_data->size);
+      GstVideoCaptionMeta *cc_meta = NULL;
+      gpointer iter = NULL;
+      gboolean found_708_raw_meta = FALSE;
+
+      GST_LOG_OBJECT (ffmpegdec,
+          "Found CC side data of type AV_FRAME_DATA_A53_CC, size %d",
+          side_data->size);
       GST_MEMDUMP ("A53 CC", side_data->data, side_data->size);
-      out_frame->output_buffer =
-          gst_buffer_make_writable (out_frame->output_buffer);
-      gst_buffer_add_video_caption_meta (out_frame->output_buffer,
-          GST_VIDEO_CAPTION_TYPE_CEA708_RAW, side_data->data, side_data->size);
+
+      while ((cc_meta = (GstVideoCaptionMeta *)
+              gst_buffer_iterate_meta_filtered (out_frame->input_buffer, &iter,
+                  GST_VIDEO_CAPTION_META_API_TYPE))) {
+        if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW)
+          continue;
+        found_708_raw_meta = TRUE;
+        break;
+      }
+
+      /* do not add CEA 708 caption meta if it already exists */
+      if (!found_708_raw_meta) {
+        out_frame->output_buffer =
+            gst_buffer_make_writable (out_frame->output_buffer);
+        gst_buffer_add_video_caption_meta (out_frame->output_buffer,
+            GST_VIDEO_CAPTION_TYPE_CEA708_RAW, side_data->data,
+            side_data->size);
+      } else {
+        GST_LOG_OBJECT (ffmpegdec,
+            "CEA 708 caption meta already exists: will not add new caption meta");
+      }
     }
   }