@@ -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