@ -28,6 +28,7 @@
# include "libavutil/mathematics.h"
# include "libavutil/opt.h"
# include "libavutil/avassert.h"
# include "libavutil/dovi_meta.h"
# include "libavcodec/bytestream.h"
# include "libavcodec/get_bits.h"
# include "libavcodec/opus.h"
@ -2146,6 +2147,53 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type
st - > request_probe = 0 ;
}
break ;
case 0xb0 : /* DOVI video stream descriptor */
{
uint32_t buf ;
AVDOVIDecoderConfigurationRecord * dovi ;
size_t dovi_size ;
int ret ;
if ( desc_end - * pp < 4 ) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8
return AVERROR_INVALIDDATA ;
dovi = av_dovi_alloc ( & dovi_size ) ;
if ( ! dovi )
return AVERROR ( ENOMEM ) ;
dovi - > dv_version_major = get8 ( pp , desc_end ) ;
dovi - > dv_version_minor = get8 ( pp , desc_end ) ;
buf = get16 ( pp , desc_end ) ;
dovi - > dv_profile = ( buf > > 9 ) & 0x7f ; // 7 bits
dovi - > dv_level = ( buf > > 3 ) & 0x3f ; // 6 bits
dovi - > rpu_present_flag = ( buf > > 2 ) & 0x01 ; // 1 bit
dovi - > el_present_flag = ( buf > > 1 ) & 0x01 ; // 1 bit
dovi - > bl_present_flag = buf & 0x01 ; // 1 bit
if ( desc_end - * pp > = 20 ) { // 4 + 4 * 4
buf = get8 ( pp , desc_end ) ;
dovi - > dv_bl_signal_compatibility_id = ( buf > > 4 ) & 0x0f ; // 4 bits
} else {
// 0 stands for None
// Dolby Vision V1.2.93 profiles and levels
dovi - > dv_bl_signal_compatibility_id = 0 ;
}
ret = av_stream_add_side_data ( st , AV_PKT_DATA_DOVI_CONF ,
( uint8_t * ) dovi , dovi_size ) ;
if ( ret < 0 ) {
av_freep ( dovi ) ;
return ret ;
}
av_log ( fc , AV_LOG_TRACE , " DOVI, version: %d.%d, profile: %d, level: %d, "
" rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d \n " ,
dovi - > dv_version_major , dovi - > dv_version_minor ,
dovi - > dv_profile , dovi - > dv_level ,
dovi - > rpu_present_flag ,
dovi - > el_present_flag ,
dovi - > bl_present_flag ,
dovi - > dv_bl_signal_compatibility_id ) ;
}
break ;
default :
break ;
}