From 3712b297c3487780d31151362b85c49ca27ff8ad Mon Sep 17 00:00:00 2001 From: John Stebbins Date: Fri, 15 Mar 2019 15:27:01 -0600 Subject: libhb: propagate color matrix info through the pipeline Propagates pix_fmt, range, primaries, transfer, and matrix everywhere. Everything that passes or creates video frames tags the frames with their color matrix info. All filters know the expected color matrix info of input frames. --- libhb/hbffmpeg.c | 238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 236 insertions(+), 2 deletions(-) (limited to 'libhb/hbffmpeg.c') diff --git a/libhb/hbffmpeg.c b/libhb/hbffmpeg.c index c604bf703..e0168a8cb 100644 --- a/libhb/hbffmpeg.c +++ b/libhb/hbffmpeg.c @@ -37,6 +37,12 @@ void hb_video_buffer_to_avframe(AVFrame *frame, hb_buffer_t * buf) frame->format = buf->f.fmt; frame->interlaced_frame = !!buf->s.combed; frame->top_field_first = !!(buf->s.flags & PIC_FLAG_TOP_FIELD_FIRST); + + frame->format = buf->f.fmt; + frame->color_primaries = hb_colr_pri_hb_to_ff(buf->f.color_prim); + frame->color_trc = hb_colr_tra_hb_to_ff(buf->f.color_transfer); + frame->colorspace = hb_colr_mat_hb_to_ff(buf->f.color_matrix); + frame->color_range = buf->f.color_range; } void hb_avframe_set_video_buffer_flags(hb_buffer_t * buf, AVFrame *frame, @@ -70,7 +76,12 @@ void hb_avframe_set_video_buffer_flags(hb_buffer_t * buf, AVFrame *frame, { buf->s.flags |= PIC_FLAG_REPEAT_FRAME; } - buf->s.frametype = get_frame_type(frame->pict_type); + buf->s.frametype = get_frame_type(frame->pict_type); + buf->f.fmt = frame->format; + buf->f.color_prim = hb_colr_pri_ff_to_hb(frame->color_primaries); + buf->f.color_transfer = hb_colr_tra_ff_to_hb(frame->color_trc); + buf->f.color_matrix = hb_colr_mat_ff_to_hb(frame->colorspace); + buf->f.color_range = frame->color_range; } hb_buffer_t * hb_avframe_to_video_buffer(AVFrame *frame, AVRational time_base) @@ -163,7 +174,7 @@ hb_sws_get_context(int srcW, int srcH, enum AVPixelFormat srcFormat, return ctx; } -int hb_ff_get_colorspace(int color_matrix) +int hb_sws_get_colorspace(int color_matrix) { int color_space = SWS_CS_DEFAULT; @@ -189,6 +200,229 @@ int hb_ff_get_colorspace(int color_matrix) return color_space; } +int hb_colr_pri_hb_to_ff(int colr_prim) +{ + switch (colr_prim) + { + case HB_COLR_PRI_BT709: + return AVCOL_PRI_BT709; + case HB_COLR_PRI_EBUTECH: + return AVCOL_PRI_BT470BG; + case HB_COLR_PRI_BT470M: + return AVCOL_PRI_BT470M; + case HB_COLR_PRI_SMPTEC: + return AVCOL_PRI_SMPTE170M; + case HB_COLR_PRI_SMPTE240M: + return AVCOL_PRI_SMPTE240M; + case HB_COLR_PRI_BT2020: + return AVCOL_PRI_BT2020; + case HB_COLR_PRI_SMPTE428: + return AVCOL_PRI_SMPTE428; + case HB_COLR_PRI_SMPTE431: + return AVCOL_PRI_SMPTE431; + case HB_COLR_PRI_SMPTE432: + return AVCOL_PRI_SMPTE432; + case HB_COLR_PRI_JEDEC_P22: + return AVCOL_PRI_JEDEC_P22; + default: + case HB_COLR_PRI_UNDEF: + return AVCOL_PRI_UNSPECIFIED; + } +} + +int hb_colr_tra_hb_to_ff(int colr_tra) +{ + switch (colr_tra) + { + case HB_COLR_TRA_BT709: + return AVCOL_TRC_BT709; + case HB_COLR_TRA_GAMMA22: + return AVCOL_TRC_GAMMA22; + case HB_COLR_TRA_GAMMA28: + return AVCOL_TRC_GAMMA28; + case HB_COLR_TRA_SMPTE170M: + return AVCOL_TRC_SMPTE170M; + case HB_COLR_TRA_SMPTE240M: + return AVCOL_TRC_SMPTE240M; + case HB_COLR_TRA_LINEAR: + return AVCOL_TRC_LINEAR; + case HB_COLR_TRA_LOG: + return AVCOL_TRC_LOG; + case HB_COLR_TRA_LOG_SQRT: + return AVCOL_TRC_LOG_SQRT; + case HB_COLR_TRA_IEC61966_2_4: + return AVCOL_TRC_IEC61966_2_4; + case HB_COLR_TRA_BT1361_ECG: + return AVCOL_TRC_BT1361_ECG; + case HB_COLR_TRA_IEC61966_2_1: + return AVCOL_TRC_IEC61966_2_1; + case HB_COLR_TRA_BT2020_10: + return AVCOL_TRC_BT2020_10; + case HB_COLR_TRA_BT2020_12: + return AVCOL_TRC_BT2020_12; + case HB_COLR_TRA_SMPTEST2084: + return AVCOL_TRC_SMPTE2084; + case HB_COLR_TRA_SMPTE428: + return AVCOL_TRC_SMPTE428; + case HB_COLR_TRA_ARIB_STD_B67: + return AVCOL_TRC_ARIB_STD_B67; + default: + case HB_COLR_TRA_UNDEF: + return AVCOL_TRC_UNSPECIFIED; + } +} + +int hb_colr_mat_hb_to_ff(int colr_mat) +{ + switch (colr_mat) + { + case HB_COLR_MAT_RGB: + return AVCOL_SPC_RGB; + case HB_COLR_MAT_BT709: + return AVCOL_SPC_BT709; + case HB_COLR_MAT_FCC: + return AVCOL_SPC_FCC; + case HB_COLR_MAT_BT470BG: + return AVCOL_SPC_BT470BG; + case HB_COLR_MAT_SMPTE170M: + return AVCOL_SPC_SMPTE170M; + case HB_COLR_MAT_SMPTE240M: + return AVCOL_SPC_SMPTE240M; + case HB_COLR_MAT_YCGCO: + return AVCOL_SPC_YCGCO; + case HB_COLR_MAT_BT2020_NCL: + return AVCOL_SPC_BT2020_NCL; + case HB_COLR_MAT_BT2020_CL: + return AVCOL_SPC_BT2020_CL; + case HB_COLR_MAT_SMPTE2085: + return AVCOL_SPC_SMPTE2085; + case HB_COLR_MAT_CD_NCL: + return AVCOL_SPC_CHROMA_DERIVED_NCL; + case HB_COLR_MAT_CD_CL: + return AVCOL_SPC_CHROMA_DERIVED_CL; + case HB_COLR_MAT_ICTCP: + return AVCOL_SPC_ICTCP; + default: + case HB_COLR_MAT_UNDEF: + return AVCOL_SPC_UNSPECIFIED; + } +} + +int hb_colr_pri_ff_to_hb(int colr_prim) +{ + switch (colr_prim) + { + case AVCOL_PRI_BT709: + return HB_COLR_PRI_BT709; + case AVCOL_PRI_BT470M: + return HB_COLR_PRI_BT470M; + case AVCOL_PRI_BT470BG: + return HB_COLR_PRI_EBUTECH; + case AVCOL_PRI_SMPTE170M: + return HB_COLR_PRI_SMPTEC; + case AVCOL_PRI_SMPTE240M: + return HB_COLR_PRI_SMPTE240M; + case AVCOL_PRI_FILM: + return HB_COLR_PRI_FILM; + case AVCOL_PRI_BT2020: + return HB_COLR_PRI_BT2020; + case AVCOL_PRI_SMPTE428: + return HB_COLR_PRI_SMPTE428; + case AVCOL_PRI_SMPTE431: + return HB_COLR_PRI_SMPTE431; + case AVCOL_PRI_SMPTE432: + return HB_COLR_PRI_SMPTE432; + case AVCOL_PRI_JEDEC_P22: + return HB_COLR_PRI_JEDEC_P22; + default: + case AVCOL_PRI_RESERVED: + case AVCOL_PRI_RESERVED0: + case AVCOL_PRI_UNSPECIFIED: + return HB_COLR_PRI_UNDEF; + } +} + +int hb_colr_tra_ff_to_hb(int colr_tra) +{ + switch (colr_tra) + { + case AVCOL_TRC_BT709: + return HB_COLR_TRA_BT709; + case AVCOL_TRC_GAMMA22: + return HB_COLR_TRA_GAMMA22; + case AVCOL_TRC_GAMMA28: + return HB_COLR_TRA_GAMMA28; + case AVCOL_TRC_SMPTE170M: + return HB_COLR_TRA_SMPTE170M; + case AVCOL_TRC_SMPTE240M: + return HB_COLR_TRA_SMPTE240M; + case AVCOL_TRC_LINEAR: + return HB_COLR_TRA_LINEAR; + case AVCOL_TRC_LOG: + return HB_COLR_TRA_LOG; + case AVCOL_TRC_LOG_SQRT: + return HB_COLR_TRA_LOG_SQRT; + case AVCOL_TRC_IEC61966_2_4: + return HB_COLR_TRA_IEC61966_2_4; + case AVCOL_TRC_BT1361_ECG: + return HB_COLR_TRA_BT1361_ECG; + case AVCOL_TRC_IEC61966_2_1: + return HB_COLR_TRA_IEC61966_2_1; + case AVCOL_TRC_BT2020_10: + return HB_COLR_TRA_BT2020_10; + case AVCOL_TRC_BT2020_12: + return HB_COLR_TRA_BT2020_12; + case AVCOL_TRC_SMPTE2084: + return HB_COLR_TRA_SMPTEST2084; + case AVCOL_TRC_SMPTE428: + return HB_COLR_TRA_SMPTE428; + case AVCOL_TRC_ARIB_STD_B67: + return HB_COLR_TRA_ARIB_STD_B67; + default: + case AVCOL_TRC_UNSPECIFIED: + case AVCOL_TRC_RESERVED: + case AVCOL_TRC_RESERVED0: + return HB_COLR_TRA_UNDEF; + } +} + +int hb_colr_mat_ff_to_hb(int colr_mat) +{ + switch (colr_mat) + { + case AVCOL_SPC_RGB: + return HB_COLR_MAT_RGB; + case AVCOL_SPC_BT709: + return HB_COLR_MAT_BT709; + case AVCOL_SPC_FCC: + return HB_COLR_MAT_FCC; + case AVCOL_SPC_BT470BG: + return HB_COLR_MAT_BT470BG; + case AVCOL_SPC_SMPTE170M: + return HB_COLR_MAT_SMPTE170M; + case AVCOL_SPC_SMPTE240M: + return HB_COLR_MAT_SMPTE240M; + case AVCOL_SPC_YCGCO: + return HB_COLR_MAT_YCGCO; + case AVCOL_SPC_BT2020_NCL: + return HB_COLR_MAT_BT2020_NCL; + case AVCOL_SPC_BT2020_CL: + return HB_COLR_MAT_BT2020_CL; + case AVCOL_SPC_SMPTE2085: + return HB_COLR_MAT_SMPTE2085; + case AVCOL_SPC_CHROMA_DERIVED_NCL: + return HB_COLR_MAT_CD_NCL; + case AVCOL_SPC_CHROMA_DERIVED_CL: + return HB_COLR_MAT_CD_CL; + case AVCOL_SPC_ICTCP: + return HB_COLR_MAT_ICTCP; + default: + case AVCOL_SPC_UNSPECIFIED: + case AVCOL_SPC_RESERVED: + return HB_COLR_MAT_UNDEF; + } +} + uint64_t hb_ff_mixdown_xlat(int hb_mixdown, int *downmix_mode) { uint64_t ff_layout = 0; -- cgit v1.2.3