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
gugelfrei
Marco Nelissen 5 years ago
parent f31b173dd1
commit cc7c195bb5

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

@ -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 {

Loading…
Cancel
Save