ccextractor: Copy over timecode meta from the input buffers to the outgoing caption buffers

Formats like SCC and MCC work based on timecodes so ideally we pass
through the timecodes when writing them.
This commit is contained in:
Sebastian Dröge 2018-12-05 19:01:40 +02:00 committed by Sebastian Dröge
parent f0571a94fb
commit 98b2c705c4
2 changed files with 40 additions and 2 deletions

View file

@ -307,7 +307,7 @@ create_caps_from_caption_type (GstVideoCaptionType caption_type,
static GstFlowReturn
gst_cc_extractor_handle_meta (GstCCExtractor * filter, GstBuffer * buf,
GstVideoCaptionMeta * meta)
GstVideoCaptionMeta * meta, GstVideoTimeCodeMeta * tc_meta)
{
GstBuffer *outbuf = NULL;
GstEvent *event;
@ -390,6 +390,9 @@ gst_cc_extractor_handle_meta (GstCCExtractor * filter, GstBuffer * buf,
GST_BUFFER_DTS (outbuf) = GST_BUFFER_DTS (buf);
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buf);
if (tc_meta)
gst_buffer_add_video_time_code_meta (outbuf, &tc_meta->tc);
/* We don't really care about the flow return */
flow = gst_pad_push (filter->captionpad, outbuf);
@ -404,12 +407,15 @@ gst_cc_extractor_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
GstCCExtractor *filter = (GstCCExtractor *) parent;
GstFlowReturn flow = GST_FLOW_OK;
GstVideoCaptionMeta *cc_meta;
GstVideoTimeCodeMeta *tc_meta;
gpointer iter = NULL;
tc_meta = gst_buffer_get_video_time_code_meta (buf);
while ((cc_meta =
(GstVideoCaptionMeta *) gst_buffer_iterate_meta_filtered (buf, &iter,
GST_VIDEO_CAPTION_META_API_TYPE)) && flow == GST_FLOW_OK) {
flow = gst_cc_extractor_handle_meta (filter, buf, cc_meta);
flow = gst_cc_extractor_handle_meta (filter, buf, cc_meta, tc_meta);
}
/* If there's an issue handling the CC, return immediately */

View file

@ -86,6 +86,8 @@ GST_START_TEST (captions)
GstBuffer *buf, *outbuf;
const guint8 caption_data[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
GstCaps *caps;
GstVideoTimeCode *tc;
GstVideoTimeCodeMeta *tc_meta;
h = gst_harness_new ("ccextractor");
h2 = gst_harness_new_with_element (h->element, NULL, NULL);
@ -99,10 +101,19 @@ GST_START_TEST (captions)
gst_buffer_add_video_caption_meta (buf, GST_VIDEO_CAPTION_TYPE_CEA708_RAW,
caption_data, sizeof (caption_data));
tc = gst_video_time_code_new (30, 1, NULL, GST_VIDEO_TIME_CODE_FLAGS_NONE, 0,
0, 0, 0, 0);
gst_buffer_add_video_time_code_meta (buf, tc);
outbuf = gst_harness_push_and_pull (h, gst_buffer_ref (buf));
fail_unless (outbuf != NULL);
fail_unless (outbuf == buf);
tc_meta = gst_buffer_get_video_time_code_meta (outbuf);
fail_unless (tc_meta != NULL);
fail_unless_equals_int (gst_video_time_code_compare (&tc_meta->tc, tc), 0);
gst_buffer_unref (outbuf);
gst_buffer_unref (buf);
@ -111,6 +122,12 @@ GST_START_TEST (captions)
fail_unless (outbuf != NULL);
fail_unless (gst_buffer_memcmp (outbuf, 0, caption_data,
sizeof (caption_data)) == 0);
tc_meta = gst_buffer_get_video_time_code_meta (outbuf);
fail_unless (tc_meta != NULL);
fail_unless_equals_int (gst_video_time_code_compare (&tc_meta->tc, tc), 0);
gst_video_time_code_free (tc);
gst_buffer_unref (outbuf);
caps = gst_pad_get_current_caps (h->sinkpad);
@ -129,10 +146,19 @@ GST_START_TEST (captions)
gst_buffer_add_video_caption_meta (buf, GST_VIDEO_CAPTION_TYPE_CEA708_RAW,
caption_data, sizeof (caption_data));
tc = gst_video_time_code_new (30, 1, NULL, GST_VIDEO_TIME_CODE_FLAGS_NONE, 0,
0, 0, 1, 0);
gst_buffer_add_video_time_code_meta (buf, tc);
outbuf = gst_harness_push_and_pull (h, gst_buffer_ref (buf));
fail_unless (outbuf != NULL);
fail_unless (outbuf == buf);
tc_meta = gst_buffer_get_video_time_code_meta (outbuf);
fail_unless (tc_meta != NULL);
fail_unless_equals_int (gst_video_time_code_compare (&tc_meta->tc, tc), 0);
gst_buffer_unref (outbuf);
gst_buffer_unref (buf);
@ -141,6 +167,12 @@ GST_START_TEST (captions)
fail_unless (outbuf != NULL);
fail_unless (gst_buffer_memcmp (outbuf, 0, caption_data,
sizeof (caption_data)) == 0);
tc_meta = gst_buffer_get_video_time_code_meta (outbuf);
fail_unless (tc_meta != NULL);
fail_unless_equals_int (gst_video_time_code_compare (&tc_meta->tc, tc), 0);
gst_video_time_code_free (tc);
gst_buffer_unref (outbuf);
caps = gst_pad_get_current_caps (h->sinkpad);