codecs: handle onReset() for a few encoders Test: Run PoC binaries Bug: 34749392 Bug: 34705519 Change-Id: I3356eb615b0e79272d71d72578d363671038c6dd (cherry picked from commit 5443b57cc54f2e46b35246637be26a69e9f493e1)
diff --git a/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp b/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp index ab0a228..96bbb85 100644 --- a/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp +++ b/media/libstagefright/codecs/aacenc/SoftAACEncoder.cpp
@@ -62,8 +62,7 @@ } SoftAACEncoder::~SoftAACEncoder() { - delete[] mInputFrame; - mInputFrame = NULL; + onReset(); if (mEncoderHandle) { CHECK_EQ(VO_ERR_NONE, mApiHandle->Uninit(mEncoderHandle)); @@ -579,6 +578,17 @@ } } +void SoftAACEncoder::onReset() { + delete[] mInputFrame; + mInputFrame = NULL; + mInputSize = 0; + + mSentCodecSpecificData = false; + mInputTimeUs = -1ll; + mSawInputEOS = false; + mSignalledError = false; +} + } // namespace android android::SoftOMXComponent *createSoftOMXComponent(
diff --git a/media/libstagefright/codecs/aacenc/SoftAACEncoder.h b/media/libstagefright/codecs/aacenc/SoftAACEncoder.h index d148eb7..981cbbb 100644 --- a/media/libstagefright/codecs/aacenc/SoftAACEncoder.h +++ b/media/libstagefright/codecs/aacenc/SoftAACEncoder.h
@@ -43,6 +43,8 @@ virtual void onQueueFilled(OMX_U32 portIndex); + virtual void onReset(); + private: enum { kNumBuffers = 4,
diff --git a/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp b/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp index 63215ec..5f516cb 100644 --- a/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp +++ b/media/libstagefright/codecs/aacenc/SoftAACEncoder2.cpp
@@ -72,8 +72,7 @@ SoftAACEncoder2::~SoftAACEncoder2() { aacEncClose(&mAACEncoder); - delete[] mInputFrame; - mInputFrame = NULL; + onReset(); } void SoftAACEncoder2::initPorts() { @@ -703,6 +702,17 @@ } } +void SoftAACEncoder2::onReset() { + delete[] mInputFrame; + mInputFrame = NULL; + mInputSize = 0; + + mSentCodecSpecificData = false; + mInputTimeUs = -1ll; + mSawInputEOS = false; + mSignalledError = false; +} + } // namespace android android::SoftOMXComponent *createSoftOMXComponent(
diff --git a/media/libstagefright/codecs/aacenc/SoftAACEncoder2.h b/media/libstagefright/codecs/aacenc/SoftAACEncoder2.h index bce9c24..f1b81e1 100644 --- a/media/libstagefright/codecs/aacenc/SoftAACEncoder2.h +++ b/media/libstagefright/codecs/aacenc/SoftAACEncoder2.h
@@ -42,6 +42,8 @@ virtual void onQueueFilled(OMX_U32 portIndex); + virtual void onReset(); + private: enum { kNumBuffers = 4,
diff --git a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp index 2eb51c9..8002386 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp +++ b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp
@@ -99,6 +99,7 @@ SoftMPEG4Encoder::~SoftMPEG4Encoder() { ALOGV("Destruct SoftMPEG4Encoder"); + onReset(); releaseEncoder(); List<BufferInfo *> &outQueue = getPortQueue(1); List<BufferInfo *> &inQueue = getPortQueue(0); @@ -208,22 +209,15 @@ } OMX_ERRORTYPE SoftMPEG4Encoder::releaseEncoder() { - if (!mStarted) { - return OMX_ErrorNone; + if (mEncParams) { + delete mEncParams; + mEncParams = NULL; } - PVCleanUpVideoEncoder(mHandle); - - free(mInputFrameData); - mInputFrameData = NULL; - - delete mEncParams; - mEncParams = NULL; - - delete mHandle; - mHandle = NULL; - - mStarted = false; + if (mHandle) { + delete mHandle; + mHandle = NULL; + } return OMX_ErrorNone; } @@ -519,6 +513,19 @@ } } +void SoftMPEG4Encoder::onReset() { + if (!mStarted) { + return; + } + + PVCleanUpVideoEncoder(mHandle); + + free(mInputFrameData); + mInputFrameData = NULL; + + mStarted = false; +} + } // namespace android android::SoftOMXComponent *createSoftOMXComponent(
diff --git a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h index 3389c37..422fe22 100644 --- a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h +++ b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h
@@ -48,6 +48,8 @@ virtual void onQueueFilled(OMX_U32 portIndex); + virtual void onReset(); + protected: virtual ~SoftMPEG4Encoder();
diff --git a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp index 5edfbb5..56e1f77 100644 --- a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp +++ b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp
@@ -793,7 +793,9 @@ if (inputBufferHeader->nTimeStamp > mLastTimestamp) { frameDuration = (uint32_t)(inputBufferHeader->nTimeStamp - mLastTimestamp); } else { - frameDuration = (uint32_t)(((uint64_t)1000000 << 16) / mFramerate); + // Use default of 30 fps in case of 0 frame rate. + uint32_t framerate = mFramerate ?: (30 << 16); + frameDuration = (uint32_t)(((uint64_t)1000000 << 16) / framerate); } mLastTimestamp = inputBufferHeader->nTimeStamp; codec_return = vpx_codec_encode( @@ -847,6 +849,11 @@ } } +void SoftVPXEncoder::onReset() { + releaseEncoder(); + mLastTimestamp = 0x7FFFFFFFFFFFFFFFLL; +} + } // namespace android
diff --git a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h index cd0a0cf..2033e64 100644 --- a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h +++ b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h
@@ -87,6 +87,8 @@ // encoding of the frame virtual void onQueueFilled(OMX_U32 portIndex); + virtual void onReset(); + private: enum TemporalReferences { // For 1 layer case: reference all (last, golden, and alt ref), but only