SoftAVCEnc/SoftMPEG4Enc: support updated i-frame interval and encoder settings
- use key-frame interval in MPEG4 encoder
- use updated definition of nBFrames and nPFrames in AVC encoder
Bug: 30096321
Bug: 28027692
Change-Id: I68d0d5182b462cad567c329a07fdafea55d19ff7
diff --git a/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp b/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp
index 6ec8c41..9e7a3be 100644
--- a/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp
+++ b/media/libstagefright/codecs/avcenc/SoftAVCEnc.cpp
@@ -1016,10 +1016,10 @@
if ((avcType->nAllowedPictureTypes & OMX_VIDEO_PictureTypeB) &&
avcType->nPFrames) {
- mBframes = avcType->nBFrames / avcType->nPFrames;
+ mBframes = avcType->nBFrames;
}
- mIInterval = avcType->nPFrames + avcType->nBFrames;
+ mIInterval = (avcType->nPFrames + 1) * (avcType->nBFrames + 1);
mConstrainedIntraFlag = avcType->bconstIpred;
if (OMX_VIDEO_AVCLoopFilterDisable == avcType->eLoopFilterMode)
@@ -1033,7 +1033,9 @@
|| avcType->bDirect8x8Inference != OMX_FALSE
|| avcType->bDirectSpatialTemporal != OMX_FALSE
|| avcType->nCabacInitIdc != 0) {
- return OMX_ErrorUndefined;
+ // OMX does not allow a way to signal what values are wrong, so it's
+ // best for components to just do best effort in supporting these values
+ ALOGV("ignoring unsupported settings");
}
if (OK != ConvertOmxAvcLevelToAvcSpecLevel(avcType->eLevel, &mAVCEncLevel)) {
diff --git a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp
index 7638bb7..8802fad 100644
--- a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp
+++ b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.cpp
@@ -76,7 +76,7 @@
176 /* width */, 144 /* height */,
callbacks, appData, component),
mEncodeMode(COMBINE_MODE_WITH_ERR_RES),
- mIDRFrameRefreshIntervalInSec(1),
+ mKeyFrameInterval(30),
mNumInputFrames(-1),
mStarted(false),
mSawInputEOS(false),
@@ -159,14 +159,7 @@
}
// Set IDR frame refresh interval
- if (mIDRFrameRefreshIntervalInSec < 0) {
- mEncParams->intraPeriod = -1;
- } else if (mIDRFrameRefreshIntervalInSec == 0) {
- mEncParams->intraPeriod = 1; // All I frames
- } else {
- mEncParams->intraPeriod =
- (mIDRFrameRefreshIntervalInSec * mFramerate) >> 16;
- }
+ mEncParams->intraPeriod = mKeyFrameInterval;
mEncParams->numIntraMB = 0;
mEncParams->sceneDetect = PV_ON;
@@ -378,6 +371,8 @@
return OMX_ErrorUndefined;
}
+ mKeyFrameInterval = int32_t(mpeg4type->nPFrames + 1);
+
return OMX_ErrorNone;
}
diff --git a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h
index 3389c37..bb6ea92 100644
--- a/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h
+++ b/media/libstagefright/codecs/m4v_h263/enc/SoftMPEG4Encoder.h
@@ -63,7 +63,7 @@
} InputBufferInfo;
MP4EncodingMode mEncodeMode;
- int32_t mIDRFrameRefreshIntervalInSec;
+ int32_t mKeyFrameInterval; // 1: all I-frames, <0: infinite
int64_t mNumInputFrames;
bool mStarted;