Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc7c195b authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Add metadata keys for opaque CSD

This provides a generic 'passthrough' of codec specific data
from extractor to codec, without having to add conversion to/from
a format-specific key in Utils.cpp
Remove unused kKeyFlacMetadata, and unneeded vorbis conversions in Utils.cpp

Test: build, CTS

Change-Id: I177090c0b0cb5174031c68ec7ec2abf6fa15c360
parent f31b173d
Loading
Loading
Loading
Loading
+28 −39
Original line number Diff line number Diff line
@@ -645,6 +645,14 @@ static std::vector<std::pair<const char *, uint32_t>> bufferMappings {
    }
};

static std::vector<std::pair<const char *, uint32_t>> CSDMappings {
    {
        { "csd-0", kKeyOpaqueCSD0 },
        { "csd-1", kKeyOpaqueCSD1 },
        { "csd-2", kKeyOpaqueCSD2 },
    }
};

void convertMessageToMetaDataFromMappings(const sp<AMessage> &msg, sp<MetaData> &meta) {
    for (auto elem : stringMappings) {
        AString value;
@@ -681,6 +689,14 @@ void convertMessageToMetaDataFromMappings(const sp<AMessage> &msg, sp<MetaData>
                    MetaDataBase::Type::TYPE_NONE, value->data(), value->size());
        }
    }

    for (auto elem : CSDMappings) {
        sp<ABuffer> value;
        if (msg->findBuffer(elem.first, &value)) {
            meta->setData(elem.second,
                    MetaDataBase::Type::TYPE_NONE, value->data(), value->size());
        }
    }
}

void convertMetaDataToMessageFromMappings(const MetaDataBase *meta, sp<AMessage> format) {
@@ -721,6 +737,18 @@ void convertMetaDataToMessageFromMappings(const MetaDataBase *meta, sp<AMessage>
            format->setBuffer(elem.first, buf);
        }
    }

    for (auto elem : CSDMappings) {
        uint32_t type;
        const void* data;
        size_t size;
        if (meta->findData(elem.second, &type, &data, &size)) {
            sp<ABuffer> buf = ABuffer::CreateAsCopy(data, size);
            buf->meta()->setInt32("csd", true);
            buf->meta()->setInt64("timeUs", 0);
            format->setBuffer(elem.first, buf);
        }
    }
}

status_t convertMetaDataToMessage(
@@ -1248,30 +1276,6 @@ status_t convertMetaDataToMessage(
    } else if (meta->findData(kKeyD263, &type, &data, &size)) {
        const uint8_t *ptr = (const uint8_t *)data;
        parseH263ProfileLevelFromD263(ptr, size, msg);
    } else if (meta->findData(kKeyVorbisInfo, &type, &data, &size)) {
        sp<ABuffer> buffer = new (std::nothrow) ABuffer(size);
        if (buffer.get() == NULL || buffer->base() == NULL) {
            return NO_MEMORY;
        }
        memcpy(buffer->data(), data, size);

        buffer->meta()->setInt32("csd", true);
        buffer->meta()->setInt64("timeUs", 0);
        msg->setBuffer("csd-0", buffer);

        if (!meta->findData(kKeyVorbisBooks, &type, &data, &size)) {
            return -EINVAL;
        }

        buffer = new (std::nothrow) ABuffer(size);
        if (buffer.get() == NULL || buffer->base() == NULL) {
            return NO_MEMORY;
        }
        memcpy(buffer->data(), data, size);

        buffer->meta()->setInt32("csd", true);
        buffer->meta()->setInt64("timeUs", 0);
        msg->setBuffer("csd-1", buffer);
    } else if (meta->findData(kKeyOpusHeader, &type, &data, &size)) {
        sp<ABuffer> buffer = new (std::nothrow) ABuffer(size);
        if (buffer.get() == NULL || buffer->base() == NULL) {
@@ -1310,16 +1314,6 @@ status_t convertMetaDataToMessage(
        buffer->meta()->setInt32("csd", true);
        buffer->meta()->setInt64("timeUs", 0);
        msg->setBuffer("csd-2", buffer);
    } else if (meta->findData(kKeyFlacMetadata, &type, &data, &size)) {
        sp<ABuffer> buffer = new (std::nothrow) ABuffer(size);
        if (buffer.get() == NULL || buffer->base() == NULL) {
            return NO_MEMORY;
        }
        memcpy(buffer->data(), data, size);

        buffer->meta()->setInt32("csd", true);
        buffer->meta()->setInt64("timeUs", 0);
        msg->setBuffer("csd-0", buffer);
    } else if (meta->findData(kKeyVp9CodecPrivate, &type, &data, &size)) {
        sp<ABuffer> buffer = new (std::nothrow) ABuffer(size);
        if (buffer.get() == NULL || buffer->base() == NULL) {
@@ -1796,11 +1790,6 @@ void convertMessageToMetaData(const sp<AMessage> &msg, sp<MetaData> &meta) {
            if (seekPreRollBuf) {
                meta->setData(kKeyOpusSeekPreRoll, 0, seekPreRollBuf, seekPreRollBufSize);
            }
        } else if (mime == MEDIA_MIMETYPE_AUDIO_VORBIS) {
            meta->setData(kKeyVorbisInfo, 0, csd0->data(), csd0->size());
            if (msg->findBuffer("csd-1", &csd1)) {
                meta->setData(kKeyVorbisBooks, 0, csd1->data(), csd1->size());
            }
        } else if (mime == MEDIA_MIMETYPE_AUDIO_ALAC) {
            meta->setData(kKeyAlacMagicCookie, 0, csd0->data(), csd0->size());
        }
+5 −1
Original line number Diff line number Diff line
@@ -67,7 +67,6 @@ enum {
    kKeyOpusHeader        = 'ohdr',  // raw data
    kKeyOpusCodecDelay    = 'ocod',  // uint64_t (codec delay in ns)
    kKeyOpusSeekPreRoll   = 'ospr',  // uint64_t (seek preroll in ns)
    kKeyFlacMetadata      = 'flMd',  // raw data
    kKeyVp9CodecPrivate   = 'vp9p',  // raw data (vp9 csd information)
    kKeyIsSyncFrame       = 'sync',  // int32_t (bool)
    kKeyIsCodecConfig     = 'conf',  // int32_t (bool)
@@ -234,6 +233,11 @@ enum {

    // AC-4 AudioPresentationInfo
    kKeyAudioPresentationInfo = 'audP',  // raw data

    // opaque codec specific data being passed from extractor to codec
    kKeyOpaqueCSD0       = 'csd0',
    kKeyOpaqueCSD1       = 'csd1',
    kKeyOpaqueCSD2       = 'csd2',
};

enum {