[vlc-commits] codec: avcodec: extract cc
Francois Cartegnie
git at videolan.org
Thu May 18 12:34:53 CEST 2017
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon May 15 18:00:06 2017 +0200| [b7feb2d9a19a94ae4771461b47a3a9ff71e363c4] | committer: Francois Cartegnie
codec: avcodec: extract cc
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=b7feb2d9a19a94ae4771461b47a3a9ff71e363c4
---
modules/codec/avcodec/video.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index a8c812e27d..51ca423b9e 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -46,6 +46,8 @@
#include "avcodec.h"
#include "va.h"
+#include "../codec/cc.h"
+
/*****************************************************************************
* decoder_sys_t : decoder descriptor
*****************************************************************************/
@@ -56,6 +58,9 @@ struct decoder_sys_t
/* Video decoder specific part */
mtime_t i_pts;
+ /* Closed captions for decoders */
+ cc_data_t cc;
+
/* for frame skipping algo */
bool b_hurry_up;
bool b_show_corrupted;
@@ -300,6 +305,7 @@ static int lavc_UpdateVideoFormat(decoder_t *dec, AVCodecContext *ctx,
if (val)
return val;
+ const int i_cc_reorder = dec->fmt_out.subs.cc.i_reorder_depth;
fmt_out.p_palette = dec->fmt_out.video.p_palette;
dec->fmt_out.video.p_palette = NULL;
@@ -312,6 +318,9 @@ static int lavc_UpdateVideoFormat(decoder_t *dec, AVCodecContext *ctx,
if ( dec->fmt_in.video.mastering.max_luminance )
dec->fmt_out.video.mastering = dec->fmt_in.video.mastering;
dec->fmt_out.video.lighting = dec->fmt_in.video.lighting;
+
+ dec->fmt_out.subs.cc.i_reorder_depth = i_cc_reorder;
+
return decoder_UpdateVideoFormat(dec);
}
@@ -376,6 +385,7 @@ static int OpenVideoCodec( decoder_t *p_dec )
p_sys->pix_fmt = AV_PIX_FMT_NONE;
p_sys->profile = -1;
p_sys->level = -1;
+ cc_Init( &p_sys->cc );
post_mt( p_sys );
ret = ffmpeg_OpenCodec( p_dec );
@@ -586,6 +596,7 @@ static void Flush( decoder_t *p_dec )
p_sys->i_pts = VLC_TS_INVALID; /* To make sure we recover properly */
p_sys->i_late_frames = 0;
+ cc_Flush( &p_sys->cc );
/* Abort pictures in order to unblock all avcodec workers threads waiting
* for a picture. This will avoid a deadlock between avcodec_flush_buffers
@@ -610,6 +621,7 @@ static bool check_block_validity( decoder_sys_t *p_sys, block_t *block )
if( block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
{
p_sys->i_pts = VLC_TS_INVALID; /* To make sure we recover properly */
+ cc_Flush( &p_sys->cc );
p_sys->i_late_frames = 0;
if( block->i_flags & BLOCK_FLAG_CORRUPTED )
@@ -1127,6 +1139,28 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
}
}
#endif
+
+ const AVFrameSideData *p_avcc = av_frame_get_side_data( frame, AV_FRAME_DATA_A53_CC );
+ if( p_avcc )
+ {
+ cc_Extract( &p_sys->cc, CC_PAYLOAD_RAW, true, p_avcc->data, p_avcc->size );
+ if( p_sys->cc.i_data )
+ {
+ block_t *p_cc = block_Alloc( p_sys->cc.i_data );
+ if( p_cc )
+ {
+ memcpy( p_cc->p_buffer, p_sys->cc.p_data, p_sys->cc.i_data );
+ if( p_sys->cc.b_reorder )
+ p_cc->i_dts = p_cc->i_pts = i_pts;
+ else
+ p_cc->i_pts = p_cc->i_dts;
+ p_dec->fmt_out.subs.cc.i_reorder_depth = 4;
+ decoder_QueueCc( p_dec, p_cc, p_sys->cc.pb_present );
+ }
+ cc_Flush( &p_sys->cc );
+ }
+ }
+
av_frame_free(&frame);
if (format_changed)
@@ -1175,6 +1209,8 @@ void EndVideoDec( decoder_t *p_dec )
wait_mt( p_sys );
+ cc_Flush( &p_sys->cc );
+
ffmpeg_CloseCodec( p_dec );
if( p_sys->p_va )
More information about the vlc-commits
mailing list