Merge "Add metrics updated callback." into udc-qpr-dev
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 998ffce..382324a 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -664,6 +664,7 @@
kWhatOutputBuffersChanged = 'outC',
kWhatFirstTunnelFrameReady = 'ftfR',
kWhatPollForRenderedBuffers = 'plrb',
+ kWhatMetricsUpdated = 'mtru',
};
class CryptoAsyncCallback : public CryptoAsync::CryptoAsyncCallback {
@@ -761,6 +762,7 @@
virtual void onOutputFramesRendered(const std::list<RenderedFrameInfo> &done) override;
virtual void onOutputBuffersChanged() override;
virtual void onFirstTunnelFrameReady() override;
+ virtual void onMetricsUpdated(const sp<AMessage> &updatedMetrics) override;
private:
const sp<AMessage> mNotify;
};
@@ -887,6 +889,13 @@
notify->post();
}
+void CodecCallback::onMetricsUpdated(const sp<AMessage> &updatedMetrics) {
+ sp<AMessage> notify(mNotify->dup());
+ notify->setInt32("what", kWhatMetricsUpdated);
+ notify->setMessage("updated-metrics", updatedMetrics);
+ notify->post();
+}
+
static MediaResourceSubType toMediaResourceSubType(MediaCodec::Domain domain) {
switch (domain) {
case MediaCodec::DOMAIN_VIDEO: return MediaResourceSubType::kVideoCodec;
@@ -4257,6 +4266,49 @@
break;
}
+ case kWhatMetricsUpdated:
+ {
+ sp<AMessage> updatedMetrics;
+ CHECK(msg->findMessage("updated-metrics", &updatedMetrics));
+
+ size_t numEntries = updatedMetrics->countEntries();
+ AMessage::Type type;
+ for (size_t i = 0; i < numEntries; ++i) {
+ const char *name = updatedMetrics->getEntryNameAt(i, &type);
+ AMessage::ItemData itemData = updatedMetrics->getEntryAt(i);
+ switch (type) {
+ case AMessage::kTypeInt32: {
+ int32_t metricValue;
+ itemData.find(&metricValue);
+ mediametrics_setInt32(mMetricsHandle, name, metricValue);
+ break;
+ }
+ case AMessage::kTypeInt64: {
+ int64_t metricValue;
+ itemData.find(&metricValue);
+ mediametrics_setInt64(mMetricsHandle, name, metricValue);
+ break;
+ }
+ case AMessage::kTypeDouble: {
+ double metricValue;
+ itemData.find(&metricValue);
+ mediametrics_setDouble(mMetricsHandle, name, metricValue);
+ break;
+ }
+ case AMessage::kTypeString: {
+ AString metricValue;
+ itemData.find(&metricValue);
+ mediametrics_setCString(mMetricsHandle, name, metricValue.c_str());
+ break;
+ }
+ // ToDo: add support for other types
+ default:
+ ALOGW("Updated metrics type not supported.");
+ }
+ }
+ break;
+ }
+
case kWhatEOS:
{
// We already notify the client of this by using the
diff --git a/media/libstagefright/include/media/stagefright/CodecBase.h b/media/libstagefright/include/media/stagefright/CodecBase.h
index 90347f9..6f06bc6 100644
--- a/media/libstagefright/include/media/stagefright/CodecBase.h
+++ b/media/libstagefright/include/media/stagefright/CodecBase.h
@@ -182,6 +182,12 @@
* Notify MediaCodec that the first tunnel frame is ready.
*/
virtual void onFirstTunnelFrameReady() = 0;
+ /**
+ * Notify MediaCodec that there are metrics to be updated.
+ *
+ * @param updatedMetrics metrics need to be updated.
+ */
+ virtual void onMetricsUpdated(const sp<AMessage> &updatedMetrics) = 0;
};
/**