Skip to content

Commit 2f18fa1

Browse files
committed
h265f: respect preferred_transfer_characteristics
HLG sample properly shows: debug: [glx] - "p.colorprim" [string]: "bt2020" debug: [glx] - "p.transfer" [string]: "arib-std-b67" debug: [glx] - "p.colmatrix" [string]: "bt2020nc" uref_pic_flow_check_hlg() should validate now
1 parent bf3afdd commit 2f18fa1

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

lib/upipe-framers/upipe_h265_framer.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,9 @@ struct upipe_h265f {
137137
/** active picture parameter set, or -1 */
138138
int active_pps;
139139

140+
/** alternative transfer characteristics */
141+
int preferred_transfer_characteristics;
142+
140143
/* parsing results - headers */
141144
/** VPS profile space */
142145
uint8_t profile_space;
@@ -336,6 +339,9 @@ static struct upipe *upipe_h265f_alloc(struct upipe_mgr *mgr,
336339
upipe_h265f->pps[i] = NULL;
337340
upipe_h265f->active_pps = -1;
338341

342+
/* 2 is NULL, see transfer_characteristics in uref_pic_flow.c */
343+
upipe_h265f->preferred_transfer_characteristics = 2;
344+
339345
upipe_h265f->acquired = false;
340346
upipe_throw_ready(upipe);
341347
return upipe;
@@ -1269,6 +1275,12 @@ static bool upipe_h265f_activate_sps(struct upipe *upipe, uint32_t sps_id)
12691275
else if (unlikely(!ubase_check(err)))
12701276
upipe_throw_fatal(upipe, err);
12711277

1278+
if (upipe_h265f->preferred_transfer_characteristics != 2) {
1279+
if (transfer_characteristics != upipe_h265f->preferred_transfer_characteristics)
1280+
transfer_characteristics = upipe_h265f->preferred_transfer_characteristics;
1281+
upipe_h265f->preferred_transfer_characteristics = 2;
1282+
}
1283+
12721284
err = uref_pic_flow_set_transfer_characteristics_val(
12731285
flow_def, transfer_characteristics);
12741286
if (unlikely(err == UBASE_ERR_UNHANDLED))
@@ -1502,6 +1514,24 @@ static int upipe_h265f_handle_sei_buffering_period(struct upipe *upipe,
15021514
return UBASE_ERR_NONE;
15031515
}
15041516

1517+
/** @internal @This handles the supplemental enhancement information called
1518+
* alternative transfer characteristics.
1519+
*
1520+
* @param upipe description structure of the pipe
1521+
* @param s block stream parsing structure
1522+
* @return an error code
1523+
*/
1524+
static int upipe_h265f_handle_sei_alternative_transfer_characteristics(struct upipe *upipe,
1525+
struct ubuf_block_stream *s)
1526+
{
1527+
struct upipe_h265f *upipe_h265f = upipe_h265f_from_upipe(upipe);
1528+
1529+
upipe_h26xf_stream_fill_bits(s, 8);
1530+
upipe_h265f->preferred_transfer_characteristics = ubuf_block_stream_show_bits(s, 8);
1531+
1532+
return UBASE_ERR_NONE;
1533+
}
1534+
15051535
/** @internal @This handles the supplemental enhancement information called
15061536
* picture timing.
15071537
*
@@ -1547,6 +1577,7 @@ static int upipe_h265f_handle_sei(struct upipe *upipe, struct ubuf *ubuf,
15471577

15481578
switch (type) {
15491579
case H265SEI_BUFFERING_PERIOD:
1580+
case H265SEI_ALTERNATIVE_TRANSFER_CHARACTERISTICS:
15501581
case H265SEI_PIC_TIMING: {
15511582
struct upipe_h26xf_stream f;
15521583
upipe_h26xf_stream_init(&f);
@@ -1568,6 +1599,9 @@ static int upipe_h265f_handle_sei(struct upipe *upipe, struct ubuf *ubuf,
15681599
case H265SEI_PIC_TIMING:
15691600
err = upipe_h265f_handle_sei_pic_timing(upipe, s);
15701601
break;
1602+
case H265SEI_ALTERNATIVE_TRANSFER_CHARACTERISTICS:
1603+
err = upipe_h265f_handle_sei_alternative_transfer_characteristics(upipe, s);
1604+
break;
15711605
default:
15721606
break;
15731607
}

0 commit comments

Comments
 (0)