diff options
author | Houxiang Dai <houxiang.dai@mediatek.com> | 2020-07-23 14:07:22 +0800 |
---|---|---|
committer | Bruno Martins <bgcngm@gmail.com> | 2021-03-07 15:30:33 +0000 |
commit | 80e20aedb084e5bb5afa6ec673ff9e0d1a2ccdf0 (patch) | |
tree | 617f51ad93699690a23af8950000b09a4ffc9fe8 | |
parent | 842477aef144e06d5a819bfc13c9e19bc931299b (diff) |
ACodec: Handle HDR10+ metadata at OutputPortSettingsChangedState
[Description]
handle kWhatSetParameters message in OutputPortSettingsChangedState
handle OMX_EventConfigUpdate event in OutputPortSettingsChangedState
In HDR10+ test, we have to associate each HDR10+ metadata to a particular
frame. If receive a kWhatSetParameters message with "hdr10-plus-info"
buffer, it should not be deferred in OutputPortSettingsChangedState and
adopt OMX_SetConfig to associates this config with the next input buffer
sent in OMX_EmptyThisBuffer. The OMX_EventConfigUpdate event report from
component should be handled also in OutputPortSettingsChangedState,
where is to associate updated "hdr10-plus-info" metadata with the next
output buffer sent via FillBufferDone callback.
Bug: 157213958
Bug: 157435393
Change-Id: I27e4614487414063831fa760b9e9ca96b1c3712c
(cherry picked from commit c111aa4fda9b5b434edb1b46898ff8dd7e51cec6)
-rw-r--r-- | media/libstagefright/ACodec.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 413c7e39a0..acf96fd9b8 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -8349,13 +8349,34 @@ bool ACodec::OutputPortSettingsChangedState::onMessageReceived( FALLTHROUGH_INTENDED; } case kWhatResume: + { + ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); + + mCodec->deferMessage(msg); + handled = true; + break; + } + case kWhatSetParameters: { - if (msg->what() == kWhatResume) { - ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); + sp<AMessage> params; + CHECK(msg->findMessage("params", ¶ms)); + + sp<ABuffer> hdr10PlusInfo; + if (params->findBuffer("hdr10-plus-info", &hdr10PlusInfo)) { + if (hdr10PlusInfo != nullptr && hdr10PlusInfo->size() > 0) { + (void)mCodec->setHdr10PlusInfo(hdr10PlusInfo); + } + params->removeEntryAt(params->findEntryByName("hdr10-plus-info")); + + if (params->countEntries() == 0) { + msg->removeEntryAt(msg->findEntryByName("params")); + } } - mCodec->deferMessage(msg); + if (msg->countEntries() > 0) { + mCodec->deferMessage(msg); + } handled = true; break; } @@ -8470,6 +8491,15 @@ bool ACodec::OutputPortSettingsChangedState::onOMXEvent( return false; } + case OMX_EventConfigUpdate: + { + CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); + + mCodec->onConfigUpdate((OMX_INDEXTYPE)data2); + + return true; + } + default: return BaseState::onOMXEvent(event, data1, data2); } |