diff options
author | Mathieu Duponchelle <mathieu@centricular.com> | 2019-03-23 00:24:25 +0100 |
---|---|---|
committer | Mathieu Duponchelle <mathieu@centricular.com> | 2019-03-23 00:27:55 +0100 |
commit | be579c426d2a6c769e59cc1f5d6adf4416813c4a (patch) | |
tree | 5ddcde6593c8fbf149e9651cc02853ab6f5438e6 | |
parent | ef8a1bdd90daa04e9022561a8c338f1a23ee4bdc (diff) | |
download | gst-libav-be579c426d2a6c769e59cc1f5d6adf4416813c4a.tar.gz |
avvidenc: pass Closed Caption metadata to libav
-rw-r--r-- | ext/libav/gstavvidenc.c | 21 |
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; |