diff options
author | Ronghua Wu <ronghuawu@google.com> | 2015-04-06 14:17:24 -0700 |
---|---|---|
committer | Ronghua Wu <ronghuawu@google.com> | 2015-04-10 14:49:44 -0700 |
commit | ed5554fb1c837f6b1008d3910018c979c57da502 (patch) | |
tree | 65ebd5ffd8e905b4756f01a508974464e2b4e5f0 | |
parent | 52e88b2986536e83a7a6da63461556b8734a85f3 (diff) | |
download | frameworks_av-ed5554fb1c837f6b1008d3910018c979c57da502.zip frameworks_av-ed5554fb1c837f6b1008d3910018c979c57da502.tar.gz frameworks_av-ed5554fb1c837f6b1008d3910018c979c57da502.tar.bz2 |
libstagefright: handle MediaFormat "operating-rate" key.
Bug: 19620911
Change-Id: I846d3cc10308a13f2ed92bb82ba7e8236d9c67d1
-rw-r--r-- | include/media/stagefright/ACodec.h | 1 | ||||
-rw-r--r-- | media/libstagefright/ACodec.cpp | 38 |
2 files changed, 39 insertions, 0 deletions
diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index c1483f3..a8d0fcb 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -300,6 +300,7 @@ private: OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels); status_t setPriority(int32_t priority); + status_t setOperatingRate(float rateFloat, bool isVideo); status_t setMinBufferSize(OMX_U32 portIndex, size_t size); diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 4efc630..45f6339 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -1685,6 +1685,16 @@ status_t ACodec::configureCodec( err = setPriority(priority); } + int32_t rateInt = -1; + float rateFloat = -1; + if (!msg->findFloat("operating-rate", &rateFloat)) { + msg->findInt32("operating-rate", &rateInt); + rateFloat = (float)rateInt; // 16MHz (FLINTMAX) is OK for upper bound. + } + if (rateFloat > 0) { + err = setOperatingRate(rateFloat, video); + } + mBaseOutputFormat = outputFormat; CHECK_EQ(getPortFormat(kPortIndexInput, inputFormat), (status_t)OK); @@ -1711,6 +1721,34 @@ status_t ACodec::setPriority(int32_t priority) { return OK; } +status_t ACodec::setOperatingRate(float rateFloat, bool isVideo) { + if (rateFloat < 0) { + return BAD_VALUE; + } + OMX_U32 rate; + if (isVideo) { + if (rateFloat > 65535) { + return BAD_VALUE; + } + rate = (OMX_U32)(rateFloat * 65536.0f + 0.5f); + } else { + if (rateFloat > UINT_MAX) { + return BAD_VALUE; + } + rate = (OMX_U32)(rateFloat); + } + OMX_PARAM_U32TYPE config; + InitOMXParams(&config); + config.nU32 = rate; + status_t err = mOMX->setConfig( + mNode, (OMX_INDEXTYPE)OMX_IndexConfigOperatingRate, + &config, sizeof(config)); + if (err != OK) { + ALOGI("codec does not support config operating rate (err %d)", err); + } + return OK; +} + status_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { OMX_PARAM_PORTDEFINITIONTYPE def; InitOMXParams(&def); |