gstreamer/ext/closedcaption/gstccconverter.h
Matthew Waters 7ed0bc539f ccconverter: split temporary storage into 3
Instead of storing the raw cc_data, store the 2 cea608 fields individually
as well as the ccp data.

Simply copying the input cc_data to the output cc_data violates a number of
requirements in the cea708 specification.  The most prominent being, that
cea608 triples must be placed at the beginning of each cdp.

We also need to comply with the framerate-dpendent limits for both the
cea608 and the ccp data which may involve splitting or merging some
cea608 data but not ccp data or vice versa.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1116>
2020-05-11 12:30:31 +00:00

84 lines
2.6 KiB
C

/*
* 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_CCCONVERTER_H__
#define __GST_CCCONVERTER_H__
#include <gst/gst.h>
#include <gst/base/base.h>
#include <gst/video/video.h>
G_BEGIN_DECLS
#define GST_TYPE_CCCONVERTER \
(gst_cc_converter_get_type())
#define GST_CCCONVERTER(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CCCONVERTER,GstCCConverter))
#define GST_CCCONVERTER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_CCCONVERTER,GstCCConverterClass))
#define GST_IS_CCCONVERTER(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_CCCONVERTER))
#define GST_IS_CCCONVERTER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_CCCONVERTER))
typedef struct _GstCCConverter GstCCConverter;
typedef struct _GstCCConverterClass GstCCConverterClass;
#define MAX_CDP_PACKET_LEN 256
#define MAX_CEA608_LEN 32
struct _GstCCConverter
{
GstBaseTransform parent;
GstVideoCaptionType input_caption_type;
GstVideoCaptionType output_caption_type;
/* CDP sequence numbers when outputting CDP */
guint16 cdp_hdr_sequence_cntr;
gint in_fps_n, in_fps_d;
gint out_fps_n, out_fps_d;
/* for framerate differences, we need to keep previous/next frames in order
* to split/merge data across multiple input or output buffers. The data is
* stored as cc_data */
guint8 scratch_cea608_1[MAX_CEA608_LEN];
guint scratch_cea608_1_len;
guint8 scratch_cea608_2[MAX_CEA608_LEN];
guint scratch_cea608_2_len;
guint8 scratch_ccp[MAX_CDP_PACKET_LEN];
guint scratch_ccp_len;
guint input_frames;
guint output_frames;
GstVideoTimeCode current_output_timecode;
/* previous buffer for copying metas onto */
GstBuffer *previous_buffer;
};
struct _GstCCConverterClass
{
GstBaseTransformClass parent_class;
};
GType gst_cc_converter_get_type (void);
G_END_DECLS
#endif /* __GST_CCCONVERTER_H__ */