[vlc-commits] codec: avcodec: split sidedata processing
Francois Cartegnie
git at videolan.org
Mon Jun 12 10:22:08 CEST 2017
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Thu Jun 8 18:40:49 2017 +0200| [558ca5ca19e008aa3834a920fb38edd19944256a] | committer: Francois Cartegnie
codec: avcodec: split sidedata processing
unreadable
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=558ca5ca19e008aa3834a920fb38edd19944256a
---
modules/codec/avcodec/video.c | 203 ++++++++++++++++++++++--------------------
1 file changed, 105 insertions(+), 98 deletions(-)
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index 55aae2d2da..e8b27fdf1e 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -747,6 +747,110 @@ static void update_late_frame_count( decoder_t *p_dec, block_t *p_block, mtime_t
}
+static void DecodeSidedata( decoder_t *p_dec, const AVFrame *frame, picture_t *p_pic )
+{
+ decoder_sys_t *p_sys = p_dec->p_sys;
+ bool format_changed = false;
+
+#if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 16, 101 ) )
+#define FROM_AVRAT(default_factor, avrat) \
+(uint64_t)(default_factor) * (avrat).num / (avrat).den
+ const AVFrameSideData *metadata =
+ av_frame_get_side_data( frame,
+ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA );
+ if ( metadata )
+ {
+ const AVMasteringDisplayMetadata *hdr_meta =
+ (const AVMasteringDisplayMetadata *) metadata->data;
+ if ( hdr_meta->has_luminance )
+ {
+#define ST2086_LUMA_FACTOR 10000
+ p_pic->format.mastering.max_luminance =
+ FROM_AVRAT(ST2086_LUMA_FACTOR, hdr_meta->max_luminance);
+ p_pic->format.mastering.min_luminance =
+ FROM_AVRAT(ST2086_LUMA_FACTOR, hdr_meta->min_luminance);
+ }
+ if ( hdr_meta->has_primaries )
+ {
+#define ST2086_RED 2
+#define ST2086_GREEN 0
+#define ST2086_BLUE 1
+#define LAV_RED 0
+#define LAV_GREEN 1
+#define LAV_BLUE 2
+#define ST2086_PRIM_FACTOR 50000
+ p_pic->format.mastering.primaries[ST2086_RED*2 + 0] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_RED][0]);
+ p_pic->format.mastering.primaries[ST2086_RED*2 + 1] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_RED][1]);
+ p_pic->format.mastering.primaries[ST2086_GREEN*2 + 0] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_GREEN][0]);
+ p_pic->format.mastering.primaries[ST2086_GREEN*2 + 1] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_GREEN][1]);
+ p_pic->format.mastering.primaries[ST2086_BLUE*2 + 0] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_BLUE][0]);
+ p_pic->format.mastering.primaries[ST2086_BLUE*2 + 1] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_BLUE][1]);
+ p_pic->format.mastering.white_point[0] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->white_point[0]);
+ p_pic->format.mastering.white_point[1] =
+ FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->white_point[1]);
+ }
+
+ if ( memcmp( &p_dec->fmt_out.video.mastering,
+ &p_pic->format.mastering,
+ sizeof(p_pic->format.mastering) ) )
+ {
+ p_dec->fmt_out.video.mastering = p_pic->format.mastering;
+ format_changed = true;
+ }
+#undef FROM_AVRAT
+ }
+#endif
+#if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 60, 100 ) )
+ const AVFrameSideData *metadata_lt =
+ av_frame_get_side_data( frame,
+ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL );
+ if ( metadata_lt )
+ {
+ const AVContentLightMetadata *light_meta =
+ (const AVContentLightMetadata *) metadata_lt->data;
+ p_pic->format.lighting.MaxCLL = light_meta->MaxCLL;
+ p_pic->format.lighting.MaxFALL = light_meta->MaxFALL;
+ if ( memcmp( &p_dec->fmt_out.video.lighting,
+ &p_pic->format.lighting,
+ sizeof(p_pic->format.lighting) ) )
+ {
+ p_dec->fmt_out.video.lighting = p_pic->format.lighting;
+ format_changed = true;
+ }
+ }
+#endif
+
+ if (format_changed)
+ decoder_UpdateVideoFormat( p_dec );
+
+ 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 = p_pic->date;
+ else
+ p_cc->i_pts = p_cc->i_dts;
+ decoder_QueueCc( p_dec, p_cc, p_sys->cc.pb_present, 4 );
+ }
+ cc_Flush( &p_sys->cc );
+ }
+ }
+}
+
/*****************************************************************************
* DecodeBlock: Called to decode one or more frames
*****************************************************************************/
@@ -1067,107 +1171,10 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
p_pic->b_progressive = !frame->interlaced_frame;
p_pic->b_top_field_first = frame->top_field_first;
- bool format_changed = false;
-#if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 16, 101 ) )
-#define FROM_AVRAT(default_factor, avrat) \
- (uint64_t)(default_factor) * (avrat).num / (avrat).den
- const AVFrameSideData *metadata =
- av_frame_get_side_data( frame,
- AV_FRAME_DATA_MASTERING_DISPLAY_METADATA );
- if ( metadata )
- {
- const AVMasteringDisplayMetadata *hdr_meta =
- (const AVMasteringDisplayMetadata *) metadata->data;
- if ( hdr_meta->has_luminance )
- {
-#define ST2086_LUMA_FACTOR 10000
- p_pic->format.mastering.max_luminance =
- FROM_AVRAT(ST2086_LUMA_FACTOR, hdr_meta->max_luminance);
- p_pic->format.mastering.min_luminance =
- FROM_AVRAT(ST2086_LUMA_FACTOR, hdr_meta->min_luminance);
- }
- if ( hdr_meta->has_primaries )
- {
-#define ST2086_RED 2
-#define ST2086_GREEN 0
-#define ST2086_BLUE 1
-#define LAV_RED 0
-#define LAV_GREEN 1
-#define LAV_BLUE 2
-#define ST2086_PRIM_FACTOR 50000
- p_pic->format.mastering.primaries[ST2086_RED*2 + 0] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_RED][0]);
- p_pic->format.mastering.primaries[ST2086_RED*2 + 1] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_RED][1]);
- p_pic->format.mastering.primaries[ST2086_GREEN*2 + 0] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_GREEN][0]);
- p_pic->format.mastering.primaries[ST2086_GREEN*2 + 1] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_GREEN][1]);
- p_pic->format.mastering.primaries[ST2086_BLUE*2 + 0] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_BLUE][0]);
- p_pic->format.mastering.primaries[ST2086_BLUE*2 + 1] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->display_primaries[LAV_BLUE][1]);
- p_pic->format.mastering.white_point[0] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->white_point[0]);
- p_pic->format.mastering.white_point[1] =
- FROM_AVRAT(ST2086_PRIM_FACTOR, hdr_meta->white_point[1]);
- }
-
- if ( memcmp( &p_dec->fmt_out.video.mastering,
- &p_pic->format.mastering,
- sizeof(p_pic->format.mastering) ) )
- {
- p_dec->fmt_out.video.mastering = p_pic->format.mastering;
- format_changed = true;
- }
-#undef FROM_AVRAT
- }
-#endif
-#if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 60, 100 ) )
- const AVFrameSideData *metadata_lt =
- av_frame_get_side_data( frame,
- AV_FRAME_DATA_CONTENT_LIGHT_LEVEL );
- if ( metadata_lt )
- {
- const AVContentLightMetadata *light_meta =
- (const AVContentLightMetadata *) metadata_lt->data;
- p_pic->format.lighting.MaxCLL = light_meta->MaxCLL;
- p_pic->format.lighting.MaxFALL = light_meta->MaxFALL;
- if ( memcmp( &p_dec->fmt_out.video.lighting,
- &p_pic->format.lighting,
- sizeof(p_pic->format.lighting) ) )
- {
- p_dec->fmt_out.video.lighting = p_pic->format.lighting;
- format_changed = true;
- }
- }
-#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;
- decoder_QueueCc( p_dec, p_cc, p_sys->cc.pb_present, 4 );
- }
- cc_Flush( &p_sys->cc );
- }
- }
+ DecodeSidedata( p_dec, frame, p_pic );
av_frame_free(&frame);
- if (format_changed)
- decoder_UpdateVideoFormat( p_dec );
-
/* Send decoded frame to vout */
if (i_pts > VLC_TS_INVALID)
{
More information about the vlc-commits
mailing list