⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp4meta.cpp

📁 mpeg4 video codec mpeg4 video codec
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is MPEG4IP. * * The Initial Developer of the Original Code is Cisco Systems Inc. * Portions created by Cisco Systems Inc. are * Copyright (C) Cisco Systems Inc. 2001.  All Rights Reserved. * * Contributor(s): *      M. Bakker     mbakker at nero.com * * Apple iTunes Metadata handling *//** The iTunes tagging seems to support any tag field name but there are some predefined fields, also known from the QuickTime format predefined fields (the ones I know of until now): - ﹏am : Name of the song/movie (string) - 〢RT : Name of the artist/performer (string) - ﹚rt : Name of the writer (string) - ゛lb : Name of the album (string) - ヾay : Year (4 bytes, e.g. "2003") (string) - ﹖oo : Tool(s) used to create the file (string) - ヽmt : Comment (string) - ゞen : Custom genre (string) - trkn : Tracknumber (8 byte string)           16 bit: empty           16 bit: tracknumber           16 bit: total tracks on album           16 bit: empty - disk : Disknumber (8 byte string)           16 bit: empty           16 bit: disknumber           16 bit: total number of disks           16 bit: empty - gnre : Genre (16 bit genre) (ID3v1 index + 1) - cpil : Part of a compilation (1 byte, 1 or 0) - tmpo : Tempo in BPM (16 bit) - covr : Cover art (xx bytes binary data) - ---- : Free form metadata, can have any name and any data**/#include "mp4common.h"bool MP4File::GetMetadataByIndex(u_int32_t index,                                 const char** ppName,                                 u_int8_t** ppValue, u_int32_t* pValueSize){    char s[256];    sprintf(s, "moov.udta.meta.ilst.*[%u].data.metadata", index);    GetBytesProperty(s, ppValue, pValueSize);    sprintf(s, "moov.udta.meta.ilst.*[%u]", index);    MP4Atom* pParent = m_pRootAtom->FindAtom(s);    *ppName = pParent->GetType();    /* check for free form tagfield */    if (memcmp(*ppName, "----", 4) == 0)    {        u_int8_t* pV;        u_int32_t VSize = 0;        char *pN;        sprintf(s, "moov.udta.meta.ilst.*[%u].name.metadata", index);        GetBytesProperty(s, &pV, &VSize);        pN = (char*)malloc((VSize+1)*sizeof(char));        memset(pN, 0, (VSize+1)*sizeof(char));        memcpy(pN, pV, VSize*sizeof(char));        *ppName = pN;    }    return true;}bool MP4File::CreateMetadataAtom(const char* name){    char s[256];    char t[256];    sprintf(t, "udta.meta.ilst.%s.data", name);    sprintf(s, "moov.udta.meta.ilst.%s.data", name);    AddDescendantAtoms("moov", t);    MP4Atom *pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)        return false;    /* some fields need special flags set */    if ((uint8_t)name[0] == 0251)    {        pMetaAtom->SetFlags(0x1);    } else if ((memcmp(name, "cpil", 4) == 0) || (memcmp(name, "tmpo", 4) == 0)) {        pMetaAtom->SetFlags(0x15);    }    MP4Atom *pHdlrAtom = m_pRootAtom->FindAtom("moov.udta.meta.hdlr");    MP4StringProperty *pStringProperty = NULL;    MP4BytesProperty *pBytesProperty = NULL;    ASSERT(pHdlrAtom);    pHdlrAtom->FindProperty(        "hdlr.handlerType", (MP4Property**)&pStringProperty);    ASSERT(pStringProperty);    pStringProperty->SetValue("mdir");    u_int8_t val[12];    memset(val, 0, 12*sizeof(u_int8_t));    val[0] = 0x61;    val[1] = 0x70;    val[2] = 0x70;    val[3] = 0x6c;    pHdlrAtom->FindProperty(        "hdlr.reserved2", (MP4Property**)&pBytesProperty);    ASSERT(pBytesProperty);    pBytesProperty->SetReadOnly(false);    pBytesProperty->SetValue(val, 12);    pBytesProperty->SetReadOnly(true);    return true;}bool MP4File::SetMetadataName(const char* value){    const char *s = "moov.udta.meta.ilst.\251nam.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("\251nam"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    pMetadataProperty->SetValue((u_int8_t*)value, strlen(value));    return true;}bool MP4File::GetMetadataName(char** value){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.\251nam.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    if (valSize > 0)    {        *value = (char*)malloc((valSize+1)*sizeof(unsigned char));        memset(*value, 0, (valSize+1)*sizeof(unsigned char));        memcpy(*value, val, valSize*sizeof(unsigned char));        return true;    } else {        *value = NULL;        return false;    }}bool MP4File::SetMetadataWriter(const char* value){    const char *s = "moov.udta.meta.ilst.\251wrt.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("\251wrt"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    pMetadataProperty->SetValue((u_int8_t*)value, strlen(value));    return true;}bool MP4File::GetMetadataWriter(char** value){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.\251wrt.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    if (valSize > 0)    {        *value = (char*)malloc((valSize+1)*sizeof(unsigned char));        memset(*value, 0, (valSize+1)*sizeof(unsigned char));        memcpy(*value, val, valSize*sizeof(unsigned char));        return true;    } else {        *value = NULL;        return false;    }}bool MP4File::SetMetadataAlbum(const char* value){    const char *s = "moov.udta.meta.ilst.\251alb.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("\251alb"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    pMetadataProperty->SetValue((u_int8_t*)value, strlen(value));    return true;}bool MP4File::GetMetadataAlbum(char** value){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.\251alb.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    if (valSize > 0)    {        *value = (char*)malloc((valSize+1)*sizeof(unsigned char));        memset(*value, 0, (valSize+1)*sizeof(unsigned char));        memcpy(*value, val, valSize*sizeof(unsigned char));        return true;    } else {        *value = NULL;        return false;    }}bool MP4File::SetMetadataArtist(const char* value){    const char *s = "moov.udta.meta.ilst.\251ART.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("\251ART"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    pMetadataProperty->SetValue((u_int8_t*)value, strlen(value));    return true;}bool MP4File::GetMetadataArtist(char** value){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.\251ART.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    if (valSize > 0)    {        *value = (char*)malloc((valSize+1)*sizeof(unsigned char));        memset(*value, 0, (valSize+1)*sizeof(unsigned char));        memcpy(*value, val, valSize*sizeof(unsigned char));        return true;    } else {        *value = NULL;        return false;    }}bool MP4File::SetMetadataTool(const char* value){    const char *s = "moov.udta.meta.ilst.\251too.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("\251too"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    pMetadataProperty->SetValue((u_int8_t*)value, strlen(value));    return true;}bool MP4File::GetMetadataTool(char** value){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.\251too.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    if (valSize > 0)    {        *value = (char*)malloc((valSize+1)*sizeof(unsigned char));        memset(*value, 0, (valSize+1)*sizeof(unsigned char));        memcpy(*value, val, valSize*sizeof(unsigned char));        return true;    } else {        *value = NULL;        return false;    }}bool MP4File::SetMetadataComment(const char* value){    const char *s = "moov.udta.meta.ilst.\251cmt.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("\251cmt"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    pMetadataProperty->SetValue((u_int8_t*)value, strlen(value));    return true;}bool MP4File::GetMetadataComment(char** value){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.\251cmt.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    if (valSize > 0)    {        *value = (char*)malloc((valSize+1)*sizeof(unsigned char));        memset(*value, 0, (valSize+1)*sizeof(unsigned char));        memcpy(*value, val, valSize*sizeof(unsigned char));        return true;    } else {        *value = NULL;        return false;    }}bool MP4File::SetMetadataYear(const char* value){    const char *s = "moov.udta.meta.ilst.\251day.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("\251day"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    if (strlen(value) < 4)        return false;    pMetadataProperty->SetValue((u_int8_t*)value, 4);    return true;}bool MP4File::GetMetadataYear(char** value){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.\251day.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    if (valSize > 0)    {        *value = (char*)malloc((valSize+1)*sizeof(unsigned char));        memset(*value, 0, (valSize+1)*sizeof(unsigned char));        memcpy(*value, val, valSize*sizeof(unsigned char));        return true;    } else {        *value = NULL;        return false;    }}bool MP4File::SetMetadataTrack(u_int16_t track, u_int16_t totalTracks){    unsigned char t[9];    const char *s = "moov.udta.meta.ilst.trkn.data";    MP4BytesProperty *pMetadataProperty = NULL;    MP4Atom *pMetaAtom = NULL;        pMetaAtom = m_pRootAtom->FindAtom(s);    if (!pMetaAtom)    {        if (!CreateMetadataAtom("trkn"))            return false;        pMetaAtom = m_pRootAtom->FindAtom(s);    }    memset(t, 0, 9*sizeof(unsigned char));    t[2] = (unsigned char)(track>>8)&0xFF;    t[3] = (unsigned char)(track)&0xFF;    t[4] = (unsigned char)(totalTracks>>8)&0xFF;    t[5] = (unsigned char)(totalTracks)&0xFF;    pMetaAtom->FindProperty("data.metadata", (MP4Property**)&pMetadataProperty);    ASSERT(pMetadataProperty);    pMetadataProperty->SetValue((u_int8_t*)t, 8);    return true;}bool MP4File::GetMetadataTrack(u_int16_t* track, u_int16_t* totalTracks){    unsigned char *val = NULL;    u_int32_t valSize = 0;    const char *s = "moov.udta.meta.ilst.trkn.data.metadata";    GetBytesProperty(s, (u_int8_t**)&val, &valSize);    *track = 0;    *totalTracks = 0;    if (valSize != 8)        return false;    *track = (u_int16_t)(val[3]);    *track += (u_int16_t)(val[2]<<8);    *totalTracks = (u_int16_t)(val[5]);    *totalTracks += (u_int16_t)(val[4]<<8);    return true;}bool MP4File::SetMetadataDisk(u_int16_t disk, u_int16_t totalDisks)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -