2018-11-05 14:24:58 +00:00
|
|
|
/*
|
|
|
|
* GStreamer
|
|
|
|
* Copyright (C) 2018 Sebastian Dröge <sebastian@centricular.com>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __GST_CCCOMBINER_H__
|
|
|
|
#define __GST_CCCOMBINER_H__
|
|
|
|
|
|
|
|
#include <gst/gst.h>
|
|
|
|
#include <gst/base/base.h>
|
|
|
|
#include <gst/video/video.h>
|
|
|
|
|
2022-06-01 11:24:41 +00:00
|
|
|
#include "ccutils.h"
|
|
|
|
|
2018-11-05 14:24:58 +00:00
|
|
|
G_BEGIN_DECLS
|
|
|
|
#define GST_TYPE_CCCOMBINER \
|
|
|
|
(gst_cc_combiner_get_type())
|
|
|
|
#define GST_CCCOMBINER(obj) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CCCOMBINER,GstCCCombiner))
|
|
|
|
#define GST_CCCOMBINER_CLASS(klass) \
|
|
|
|
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CCCOMBINER,GstCCCombinerClass))
|
|
|
|
#define GST_IS_CCCOMBINER(obj) \
|
|
|
|
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CCCOMBINER))
|
|
|
|
#define GST_IS_CCCOMBINER_CLASS(klass) \
|
|
|
|
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CCCOMBINER))
|
|
|
|
|
|
|
|
typedef struct _GstCCCombiner GstCCCombiner;
|
|
|
|
typedef struct _GstCCCombinerClass GstCCCombinerClass;
|
|
|
|
|
2024-02-01 17:45:01 +00:00
|
|
|
/**
|
|
|
|
* GstCCCombinerInputProcessing:
|
|
|
|
* @CCCOMBINER_INPUT_PROCESSING_APPEND: append aggregated CC to existing metas on video buffers
|
|
|
|
* @CCCOMBINER_INPUT_PROCESSING_DROP: drop existing CC metas on input video buffers
|
|
|
|
* @CCCOMBINER_INPUT_PROCESSING_FAVOR: discard aggregated CC when input video buffers hold CC metas already
|
2024-12-06 18:13:50 +00:00
|
|
|
* @CCCOMBINER_INPUT_PROCESSING_FORCE: discard aggregated CC even when input video buffers do not hold CC meta
|
2024-02-01 17:45:01 +00:00
|
|
|
*
|
|
|
|
* Possible processing types for the input-meta-processing property.
|
|
|
|
*
|
|
|
|
* Since: 1.26
|
|
|
|
*/
|
|
|
|
typedef enum {
|
|
|
|
CCCOMBINER_INPUT_PROCESSING_APPEND = 0,
|
|
|
|
CCCOMBINER_INPUT_PROCESSING_DROP,
|
|
|
|
CCCOMBINER_INPUT_PROCESSING_FAVOR,
|
2024-12-06 18:13:50 +00:00
|
|
|
CCCOMBINER_INPUT_PROCESSING_FORCE,
|
2024-02-01 17:45:01 +00:00
|
|
|
} GstCCCombinerInputProcessing;
|
|
|
|
|
2018-11-05 14:24:58 +00:00
|
|
|
struct _GstCCCombiner
|
|
|
|
{
|
|
|
|
GstAggregator parent;
|
|
|
|
|
2022-02-18 16:06:44 +00:00
|
|
|
GstAggregatorPad *video_pad, *caption_pad;
|
2022-02-18 16:06:44 +00:00
|
|
|
|
2018-11-05 14:24:58 +00:00
|
|
|
gint video_fps_n, video_fps_d;
|
cccombiner: implement scheduling
Prior to that, cccombiner's behaviour was essentially that of
a funnel: it strictly looked at input timestamps to associate
together video and caption buffers.
This patch instead exposes a "schedule" property, with a default
of TRUE, to control whether caption buffers should be smoothly
scheduled, in order to have exactly one per output video buffer.
This can involve rewriting input captions, for example when the
input is CDP sequence counters are rewritten, time codes are dropped
and potentially re-injected if the input video frame had a time code
meta.
Caption buffers may also get split up in order to assign captions to
the correct field when the input is interlaced.
This can also imply that the input will drift from synchronization,
when there isn't enough padding in the input stream to catch up. In
that case the element will start dropping old caption buffers once
the number of buffers in its internal queue reaches a certain limit
(configurable).
The property is exposed so that existing users of cccombiner can
revert back to the original behaviour, but should eventually be
removed, as that behaviour was simply inadequate.
This commit also disallows changing the input caption type, as
this would needlessly complicate implementation, and removes
the corresponding test.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2076>
2021-03-09 12:22:10 +00:00
|
|
|
gboolean progressive;
|
2020-04-22 14:53:00 +00:00
|
|
|
GstClockTime previous_video_running_time_end;
|
2018-11-05 14:24:58 +00:00
|
|
|
GstClockTime current_video_running_time;
|
|
|
|
GstClockTime current_video_running_time_end;
|
|
|
|
GstBuffer *current_video_buffer;
|
|
|
|
|
|
|
|
GArray *current_frame_captions;
|
cccombiner: implement scheduling
Prior to that, cccombiner's behaviour was essentially that of
a funnel: it strictly looked at input timestamps to associate
together video and caption buffers.
This patch instead exposes a "schedule" property, with a default
of TRUE, to control whether caption buffers should be smoothly
scheduled, in order to have exactly one per output video buffer.
This can involve rewriting input captions, for example when the
input is CDP sequence counters are rewritten, time codes are dropped
and potentially re-injected if the input video frame had a time code
meta.
Caption buffers may also get split up in order to assign captions to
the correct field when the input is interlaced.
This can also imply that the input will drift from synchronization,
when there isn't enough padding in the input stream to catch up. In
that case the element will start dropping old caption buffers once
the number of buffers in its internal queue reaches a certain limit
(configurable).
The property is exposed so that existing users of cccombiner can
revert back to the original behaviour, but should eventually be
removed, as that behaviour was simply inadequate.
This commit also disallows changing the input caption type, as
this would needlessly complicate implementation, and removes
the corresponding test.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2076>
2021-03-09 12:22:10 +00:00
|
|
|
GstVideoCaptionType caption_type;
|
|
|
|
|
|
|
|
gboolean prop_schedule;
|
|
|
|
guint prop_max_scheduled;
|
2022-02-01 22:46:43 +00:00
|
|
|
gboolean prop_output_padding;
|
2024-03-08 07:22:53 +00:00
|
|
|
CCBufferCea608PaddingStrategy prop_cea608_padding_strategy;
|
|
|
|
GstClockTime prop_cea608_valid_padding_timeout;
|
2024-03-12 03:25:31 +00:00
|
|
|
GstClockTime prop_schedule_timeout;
|
2024-02-01 17:45:01 +00:00
|
|
|
GstCCCombinerInputProcessing prop_input_meta_processing;
|
cccombiner: implement scheduling
Prior to that, cccombiner's behaviour was essentially that of
a funnel: it strictly looked at input timestamps to associate
together video and caption buffers.
This patch instead exposes a "schedule" property, with a default
of TRUE, to control whether caption buffers should be smoothly
scheduled, in order to have exactly one per output video buffer.
This can involve rewriting input captions, for example when the
input is CDP sequence counters are rewritten, time codes are dropped
and potentially re-injected if the input video frame had a time code
meta.
Caption buffers may also get split up in order to assign captions to
the correct field when the input is interlaced.
This can also imply that the input will drift from synchronization,
when there isn't enough padding in the input stream to catch up. In
that case the element will start dropping old caption buffers once
the number of buffers in its internal queue reaches a certain limit
(configurable).
The property is exposed so that existing users of cccombiner can
revert back to the original behaviour, but should eventually be
removed, as that behaviour was simply inadequate.
This commit also disallows changing the input caption type, as
this would needlessly complicate implementation, and removes
the corresponding test.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2076>
2021-03-09 12:22:10 +00:00
|
|
|
|
|
|
|
gboolean schedule;
|
|
|
|
guint max_scheduled;
|
2022-02-01 22:46:43 +00:00
|
|
|
gboolean output_padding;
|
2022-06-01 11:24:41 +00:00
|
|
|
guint current_scheduled;
|
2024-03-12 03:25:31 +00:00
|
|
|
GstClockTime last_caption_ts;
|
2022-06-01 11:24:41 +00:00
|
|
|
|
|
|
|
CCBuffer *cc_buffer;
|
cccombiner: implement scheduling
Prior to that, cccombiner's behaviour was essentially that of
a funnel: it strictly looked at input timestamps to associate
together video and caption buffers.
This patch instead exposes a "schedule" property, with a default
of TRUE, to control whether caption buffers should be smoothly
scheduled, in order to have exactly one per output video buffer.
This can involve rewriting input captions, for example when the
input is CDP sequence counters are rewritten, time codes are dropped
and potentially re-injected if the input video frame had a time code
meta.
Caption buffers may also get split up in order to assign captions to
the correct field when the input is interlaced.
This can also imply that the input will drift from synchronization,
when there isn't enough padding in the input stream to catch up. In
that case the element will start dropping old caption buffers once
the number of buffers in its internal queue reaches a certain limit
(configurable).
The property is exposed so that existing users of cccombiner can
revert back to the original behaviour, but should eventually be
removed, as that behaviour was simply inadequate.
This commit also disallows changing the input caption type, as
this would needlessly complicate implementation, and removes
the corresponding test.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2076>
2021-03-09 12:22:10 +00:00
|
|
|
guint16 cdp_hdr_sequence_cntr;
|
|
|
|
const struct cdp_fps_entry *cdp_fps_entry;
|
2018-11-05 14:24:58 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct _GstCCCombinerClass
|
|
|
|
{
|
|
|
|
GstAggregatorClass parent_class;
|
|
|
|
};
|
|
|
|
|
|
|
|
GType gst_cc_combiner_get_type (void);
|
|
|
|
|
2021-02-17 10:31:35 +00:00
|
|
|
GST_ELEMENT_REGISTER_DECLARE (cccombiner);
|
|
|
|
|
2018-11-05 14:24:58 +00:00
|
|
|
G_END_DECLS
|
|
|
|
#endif /* __GST_CCCOMBINER_H__ */
|