MediaCodec: propagate usage from original surface to release surface

Bug: 169968946
Bug: 160346309
Test: atest CtsSecurityTestCases:StagefrightTest#testStagefright_bug_65483665
Test: atest CtsMediaTestCases -- --module-arg CtsMediaTestCases:size:small
Merged-In: If87053e85a3692ed4b5fbc61d45612d5dbf56eb5
Change-Id: If87053e85a3692ed4b5fbc61d45612d5dbf56eb5
(cherry picked from commit 8965b09815d5db24f8e45e492c8a36e3058e6aa5)
(cherry picked from commit cf1736e2f2f3eab5c1d1d8351cd07ba0d3de5496)
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 31c800e..1d97ce6 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -314,7 +314,7 @@
 
 class MediaCodec::ReleaseSurface {
 public:
-    ReleaseSurface() {
+    explicit ReleaseSurface(uint64_t usage) {
         BufferQueue::createBufferQueue(&mProducer, &mConsumer);
         mSurface = new Surface(mProducer, false /* controlledByApp */);
         struct ConsumerListener : public BnConsumerListener {
@@ -325,6 +325,7 @@
         sp<ConsumerListener> listener{new ConsumerListener};
         mConsumer->consumerConnect(listener, false);
         mConsumer->setConsumerName(String8{"MediaCodec.release"});
+        mConsumer->setConsumerUsageBits(usage);
     }
 
     const sp<Surface> &getSurface() {
@@ -3001,7 +3002,11 @@
             if (msg->findMessage("async", &asyncNotify) && asyncNotify != nullptr) {
                 if (mSurface != NULL) {
                     if (!mReleaseSurface) {
-                        mReleaseSurface.reset(new ReleaseSurface);
+                        uint64_t usage = 0;
+                        if (mSurface->getConsumerUsage(&usage) != OK) {
+                            usage = 0;
+                        }
+                        mReleaseSurface.reset(new ReleaseSurface(usage));
                     }
                     if (mSurface != mReleaseSurface->getSurface()) {
                         status_t err = connectToSurface(mReleaseSurface->getSurface());