summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2019-03-23 00:24:25 +0100
committerMathieu Duponchelle <mathieu@centricular.com>2019-03-23 00:27:55 +0100
commitbe579c426d2a6c769e59cc1f5d6adf4416813c4a (patch)
tree5ddcde6593c8fbf149e9651cc02853ab6f5438e6
parentef8a1bdd90daa04e9022561a8c338f1a23ee4bdc (diff)
downloadgst-libav-be579c426d2a6c769e59cc1f5d6adf4416813c4a.tar.gz
avvidenc: pass Closed Caption metadata to libav
-rw-r--r--ext/libav/gstavvidenc.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/ext/libav/gstavvidenc.c b/ext/libav/gstavvidenc.c
index 6a9ab5b..ab44e9d 100644
--- a/ext/libav/gstavvidenc.c
+++ b/ext/libav/gstavvidenc.c
@@ -517,6 +517,25 @@ stereo_gst_to_av (GstVideoMultiviewMode mview_mode)
return AV_STEREO3D_2D;
}
+static void
+gst_ffmpegvidenc_add_cc (GstBuffer * buffer, AVFrame * picture)
+{
+ GstVideoCaptionMeta *cc_meta;
+ gpointer iter = NULL;
+
+ while ((cc_meta =
+ (GstVideoCaptionMeta *) gst_buffer_iterate_meta_filtered (buffer,
+ &iter, GST_VIDEO_CAPTION_META_API_TYPE))) {
+ AVFrameSideData *sd;
+
+ if (cc_meta->caption_type != GST_VIDEO_CAPTION_TYPE_CEA708_RAW)
+ continue;
+
+ sd = av_frame_new_side_data (picture, AV_FRAME_DATA_A53_CC, cc_meta->size);
+ memcpy (sd->data, cc_meta->data, cc_meta->size);
+ }
+}
+
static GstFlowReturn
gst_ffmpegvidenc_send_frame (GstFFMpegVidEnc * ffmpegenc,
GstVideoCodecFrame * frame)
@@ -533,6 +552,8 @@ gst_ffmpegvidenc_send_frame (GstFFMpegVidEnc * ffmpegenc,
picture = ffmpegenc->picture;
+ gst_ffmpegvidenc_add_cc (frame->input_buffer, picture);
+
if (ffmpegenc->context->flags & (AV_CODEC_FLAG_INTERLACED_DCT |
AV_CODEC_FLAG_INTERLACED_ME)) {
picture->interlaced_frame = TRUE;