summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs
diff options
context:
space:
mode:
authorJohann <johannkoenig@google.com>2013-09-27 17:42:12 -0700
committerJohann <johannkoenig@google.com>2013-09-27 17:47:49 -0700
commit30c08634416a99a0f627e4de3a5f49dcf0a72fd3 (patch)
treef5bad83acd4b9e75579f772b4c7e27eb08cc3189 /media/libstagefright/codecs
parent465da60d885c8fa4e7cea4626478574ce17a54a9 (diff)
downloadframeworks_av-30c08634416a99a0f627e4de3a5f49dcf0a72fd3.zip
frameworks_av-30c08634416a99a0f627e4de3a5f49dcf0a72fd3.tar.gz
frameworks_av-30c08634416a99a0f627e4de3a5f49dcf0a72fd3.tar.bz2
Change VP8 encoder bitrate
Allow the bitrate to be updated while the encoder is running. Bug: 8422347 Change-Id: I8427fe20921b00f92b8f99fe21691709fab354b0
Diffstat (limited to 'media/libstagefright/codecs')
-rw-r--r--media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp32
-rw-r--r--media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h5
2 files changed, 36 insertions, 1 deletions
diff --git a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp
index 16f0f30..8375cac 100644
--- a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp
+++ b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.cpp
@@ -141,6 +141,7 @@ SoftVPXEncoder::SoftVPXEncoder(const char *name,
mWidth(176),
mHeight(144),
mBitrate(192000), // in bps
+ mBitrateUpdated(false),
mBitrateControlMode(VPX_VBR), // variable bitrate
mFrameDurationUs(33333), // Defaults to 30 fps
mDCTPartitions(0),
@@ -536,6 +537,22 @@ OMX_ERRORTYPE SoftVPXEncoder::setConfig(
return OMX_ErrorNone;
}
+ case OMX_IndexConfigVideoBitrate:
+ {
+ OMX_VIDEO_CONFIG_BITRATETYPE *params =
+ (OMX_VIDEO_CONFIG_BITRATETYPE *)_params;
+
+ if (params->nPortIndex != kOutputPortIndex) {
+ return OMX_ErrorBadPortIndex;
+ }
+
+ if (mBitrate != params->nEncodeBitrate) {
+ mBitrate = params->nEncodeBitrate;
+ mBitrateUpdated = true;
+ }
+ return OMX_ErrorNone;
+ }
+
default:
return SimpleSoftOMXComponent::setConfig(index, _params);
}
@@ -779,6 +796,21 @@ void SoftVPXEncoder::onQueueFilled(OMX_U32 portIndex) {
mKeyFrameRequested = false;
}
+ if (mBitrateUpdated) {
+ mCodecConfiguration->rc_target_bitrate = mBitrate/1000;
+ vpx_codec_err_t res = vpx_codec_enc_config_set(mCodecContext,
+ mCodecConfiguration);
+ if (res != VPX_CODEC_OK) {
+ ALOGE("vp8 encoder failed to update bitrate: %s",
+ vpx_codec_err_to_string(res));
+ notify(OMX_EventError,
+ OMX_ErrorUndefined,
+ 0, // Extra notification data
+ NULL); // Notification data pointer
+ }
+ mBitrateUpdated = false;
+ }
+
codec_return = vpx_codec_encode(
mCodecContext,
&raw_frame,
diff --git a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h
index 4ee5e51..076830f 100644
--- a/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h
+++ b/media/libstagefright/codecs/on2/enc/SoftVPXEncoder.h
@@ -128,7 +128,10 @@ private:
int32_t mHeight;
// Target bitrate set for the encoder, in bits per second.
- int32_t mBitrate;
+ uint32_t mBitrate;
+
+ // If a request for a change it bitrate has been received.
+ bool mBitrateUpdated;
// Bitrate control mode, either constant or variable
vpx_rc_mode mBitrateControlMode;