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