1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * DOVI ISO Media common code 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (c) 2020 Vacing Fang <vacingfang@tencent.com> 5cabdff1aSopenharmony_ci * Copyright (c) 2021 quietvoid 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci#include "libavutil/dovi_meta.h" 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include "libavcodec/put_bits.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "avformat.h" 29cabdff1aSopenharmony_ci#include "dovi_isom.h" 30cabdff1aSopenharmony_ci 31cabdff1aSopenharmony_ciint ff_isom_parse_dvcc_dvvc(AVFormatContext *s, AVStream *st, const uint8_t *buf_ptr, uint64_t size) 32cabdff1aSopenharmony_ci{ 33cabdff1aSopenharmony_ci uint32_t buf; 34cabdff1aSopenharmony_ci AVDOVIDecoderConfigurationRecord *dovi; 35cabdff1aSopenharmony_ci size_t dovi_size; 36cabdff1aSopenharmony_ci int ret; 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci if (size > (1 << 30) || size < 4) 39cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci dovi = av_dovi_alloc(&dovi_size); 42cabdff1aSopenharmony_ci if (!dovi) 43cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci dovi->dv_version_major = *buf_ptr++; // 8 bits 46cabdff1aSopenharmony_ci dovi->dv_version_minor = *buf_ptr++; // 8 bits 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci buf = *buf_ptr++ << 8; 49cabdff1aSopenharmony_ci buf |= *buf_ptr++; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci dovi->dv_profile = (buf >> 9) & 0x7f; // 7 bits 52cabdff1aSopenharmony_ci dovi->dv_level = (buf >> 3) & 0x3f; // 6 bits 53cabdff1aSopenharmony_ci dovi->rpu_present_flag = (buf >> 2) & 0x01; // 1 bit 54cabdff1aSopenharmony_ci dovi->el_present_flag = (buf >> 1) & 0x01; // 1 bit 55cabdff1aSopenharmony_ci dovi->bl_present_flag = buf & 0x01; // 1 bit 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_ci // Has enough remaining data 58cabdff1aSopenharmony_ci if (size >= 5) { 59cabdff1aSopenharmony_ci dovi->dv_bl_signal_compatibility_id = ((*buf_ptr++) >> 4) & 0x0f; // 4 bits 60cabdff1aSopenharmony_ci } else { 61cabdff1aSopenharmony_ci // 0 stands for None 62cabdff1aSopenharmony_ci // Dolby Vision V1.2.93 profiles and levels 63cabdff1aSopenharmony_ci dovi->dv_bl_signal_compatibility_id = 0; 64cabdff1aSopenharmony_ci } 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_ci ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, 67cabdff1aSopenharmony_ci (uint8_t *)dovi, dovi_size); 68cabdff1aSopenharmony_ci if (ret < 0) { 69cabdff1aSopenharmony_ci av_free(dovi); 70cabdff1aSopenharmony_ci return ret; 71cabdff1aSopenharmony_ci } 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci av_log(s, AV_LOG_TRACE, "DOVI in dvcC/dvvC/dvwC box, version: %d.%d, profile: %d, level: %d, " 74cabdff1aSopenharmony_ci "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", 75cabdff1aSopenharmony_ci dovi->dv_version_major, dovi->dv_version_minor, 76cabdff1aSopenharmony_ci dovi->dv_profile, dovi->dv_level, 77cabdff1aSopenharmony_ci dovi->rpu_present_flag, 78cabdff1aSopenharmony_ci dovi->el_present_flag, 79cabdff1aSopenharmony_ci dovi->bl_present_flag, 80cabdff1aSopenharmony_ci dovi->dv_bl_signal_compatibility_id); 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci return 0; 83cabdff1aSopenharmony_ci} 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_civoid ff_isom_put_dvcc_dvvc(AVFormatContext *s, uint8_t out[ISOM_DVCC_DVVC_SIZE], 86cabdff1aSopenharmony_ci AVDOVIDecoderConfigurationRecord *dovi) 87cabdff1aSopenharmony_ci{ 88cabdff1aSopenharmony_ci PutBitContext pb; 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci init_put_bits(&pb, out, ISOM_DVCC_DVVC_SIZE); 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci put_bits(&pb, 8, dovi->dv_version_major); 93cabdff1aSopenharmony_ci put_bits(&pb, 8, dovi->dv_version_minor); 94cabdff1aSopenharmony_ci put_bits(&pb, 7, dovi->dv_profile & 0x7f); 95cabdff1aSopenharmony_ci put_bits(&pb, 6, dovi->dv_level & 0x3f); 96cabdff1aSopenharmony_ci put_bits(&pb, 1, !!dovi->rpu_present_flag); 97cabdff1aSopenharmony_ci put_bits(&pb, 1, !!dovi->el_present_flag); 98cabdff1aSopenharmony_ci put_bits(&pb, 1, !!dovi->bl_present_flag); 99cabdff1aSopenharmony_ci put_bits(&pb, 4, dovi->dv_bl_signal_compatibility_id & 0x0f); 100cabdff1aSopenharmony_ci 101cabdff1aSopenharmony_ci put_bits(&pb, 28, 0); /* reserved */ 102cabdff1aSopenharmony_ci put_bits32(&pb, 0); /* reserved */ 103cabdff1aSopenharmony_ci put_bits32(&pb, 0); /* reserved */ 104cabdff1aSopenharmony_ci put_bits32(&pb, 0); /* reserved */ 105cabdff1aSopenharmony_ci put_bits32(&pb, 0); /* reserved */ 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci flush_put_bits(&pb); 108cabdff1aSopenharmony_ci 109cabdff1aSopenharmony_ci av_log(s, AV_LOG_DEBUG, "DOVI in %s box, version: %d.%d, profile: %d, level: %d, " 110cabdff1aSopenharmony_ci "rpu flag: %d, el flag: %d, bl flag: %d, compatibility id: %d\n", 111cabdff1aSopenharmony_ci dovi->dv_profile > 10 ? "dvwC" : (dovi->dv_profile > 7 ? "dvvC" : "dvcC"), 112cabdff1aSopenharmony_ci dovi->dv_version_major, dovi->dv_version_minor, 113cabdff1aSopenharmony_ci dovi->dv_profile, dovi->dv_level, 114cabdff1aSopenharmony_ci dovi->rpu_present_flag, 115cabdff1aSopenharmony_ci dovi->el_present_flag, 116cabdff1aSopenharmony_ci dovi->bl_present_flag, 117cabdff1aSopenharmony_ci dovi->dv_bl_signal_compatibility_id); 118cabdff1aSopenharmony_ci} 119