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 f496b0c..d5a26d3 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);
@@ -201,22 +202,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;
}
@@ -514,6 +508,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 bb6ea92..ae8cb6f 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