diff options
author | Rachad <rachad@google.com> | 2014-05-19 18:01:41 -0700 |
---|---|---|
committer | Rachad Alao <rachad@google.com> | 2014-06-26 00:37:49 +0000 |
commit | c8efda9e9cd61dfe8e486c93fa8940b77cc3cceb (patch) | |
tree | 5b4adee3de4582d833975a1283ed9ee4c83c2790 /media/libstagefright | |
parent | ddde219f2f93c1d81ff1cfaf4d3d31d95156f7a3 (diff) | |
download | frameworks_av-c8efda9e9cd61dfe8e486c93fa8940b77cc3cceb.zip frameworks_av-c8efda9e9cd61dfe8e486c93fa8940b77cc3cceb.tar.gz frameworks_av-c8efda9e9cd61dfe8e486c93fa8940b77cc3cceb.tar.bz2 |
Add HEVC encoder support to ACodec
Bug: 14571712
Change-Id: Idaec2394d569541f3963befe722f46f6b0007937
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/ACodec.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 8f154be..5156d3e 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -2035,6 +2035,10 @@ status_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { err = setupAVCEncoderParameters(msg); break; + case OMX_VIDEO_CodingHEVC: + err = setupHEVCEncoderParameters(msg); + break; + case OMX_VIDEO_CodingVP8: case OMX_VIDEO_CodingVP9: err = setupVPXEncoderParameters(msg); @@ -2371,6 +2375,62 @@ status_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { return configureBitrate(bitrate, bitrateMode); } +status_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { + int32_t bitrate, iFrameInterval; + if (!msg->findInt32("bitrate", &bitrate) + || !msg->findInt32("i-frame-interval", &iFrameInterval)) { + return INVALID_OPERATION; + } + + OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); + + float frameRate; + if (!msg->findFloat("frame-rate", &frameRate)) { + int32_t tmp; + if (!msg->findInt32("frame-rate", &tmp)) { + return INVALID_OPERATION; + } + frameRate = (float)tmp; + } + + OMX_VIDEO_PARAM_HEVCTYPE hevcType; + InitOMXParams(&hevcType); + hevcType.nPortIndex = kPortIndexOutput; + + status_t err = OK; + err = mOMX->getParameter( + mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); + if (err != OK) { + return err; + } + + int32_t profile; + if (msg->findInt32("profile", &profile)) { + int32_t level; + if (!msg->findInt32("level", &level)) { + return INVALID_OPERATION; + } + + err = verifySupportForProfileAndLevel(profile, level); + if (err != OK) { + return err; + } + + hevcType.eProfile = static_cast<OMX_VIDEO_HEVCPROFILETYPE>(profile); + hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); + } + + // TODO: Need OMX structure definition for setting iFrameInterval + + err = mOMX->setParameter( + mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); + if (err != OK) { + return err; + } + + return configureBitrate(bitrate, bitrateMode); +} + status_t ACodec::setupVPXEncoderParameters(const sp<AMessage> &msg) { int32_t bitrate; int32_t iFrameInterval = 0; |