SurfaceUtils.cpp revision b5625ce949ceb29e5971b6e2c94d9ee054c057d7
1b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar/* 2b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * Copyright 2015 The Android Open Source Project 3b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * 4b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 5b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * you may not use this file except in compliance with the License. 6b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * You may obtain a copy of the License at 7b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * 8b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 9b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * 10b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * Unless required by applicable law or agreed to in writing, software 11b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 12b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * See the License for the specific language governing permissions and 14b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar * limitations under the License. 15b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar */ 16b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 17b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar//#define LOG_NDEBUG 0 18b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar#define LOG_TAG "SurfaceUtils" 19b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar#include <utils/Log.h> 20b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 21b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar#include <media/stagefright/SurfaceUtils.h> 22b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 23b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar#include <gui/Surface.h> 24b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 25b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnarnamespace android { 26b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 27b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnarstatus_t setNativeWindowSizeFormatAndUsage( 28b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ANativeWindow *nativeWindow /* nonnull */, 29098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar int width, int height, int format, int rotation, int usage, bool reconnect) { 30098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar status_t err = NO_ERROR; 31098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar 32098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar // In some cases we need to reconnect so that we can dequeue all buffers 33098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar if (reconnect) { 34181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang err = nativeWindowDisconnect(nativeWindow, "setNativeWindowSizeFormatAndUsage"); 35098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar if (err != NO_ERROR) { 36181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang ALOGE("nativeWindowDisconnect failed: %s (%d)", strerror(-err), -err); 37098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar return err; 38098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar } 39098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar 40181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang err = nativeWindowConnect(nativeWindow, "setNativeWindowSizeFormatAndUsage"); 41098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar if (err != NO_ERROR) { 42181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang ALOGE("nativeWindowConnect failed: %s (%d)", strerror(-err), -err); 43098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar return err; 44098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar } 45098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar } 46098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar 47098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar err = native_window_set_buffers_dimensions(nativeWindow, width, height); 48b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 49b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("native_window_set_buffers_dimensions failed: %s (%d)", strerror(-err), -err); 50b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 51b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 52b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 53b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = native_window_set_buffers_format(nativeWindow, format); 54b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 55b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("native_window_set_buffers_format failed: %s (%d)", strerror(-err), -err); 56b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 57b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 58b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 59b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar int transform = 0; 60b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if ((rotation % 90) == 0) { 61b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar switch ((rotation / 90) & 3) { 62b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar case 1: transform = HAL_TRANSFORM_ROT_90; break; 63b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar case 2: transform = HAL_TRANSFORM_ROT_180; break; 64b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar case 3: transform = HAL_TRANSFORM_ROT_270; break; 65b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar default: transform = 0; break; 66b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 67b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 68b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 69b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = native_window_set_buffers_transform(nativeWindow, transform); 70b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 71b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("native_window_set_buffers_transform failed: %s (%d)", strerror(-err), -err); 72b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 73b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 74b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 75b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner int consumerUsage = 0; 76b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner err = nativeWindow->query(nativeWindow, NATIVE_WINDOW_CONSUMER_USAGE_BITS, &consumerUsage); 77b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner if (err != NO_ERROR) { 78b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner ALOGW("failed to get consumer usage bits. ignoring"); 79b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner err = NO_ERROR; 80b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner } 81b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner 82b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // Make sure to check whether either Stagefright or the video decoder 83b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // requested protected buffers. 84b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (usage & GRALLOC_USAGE_PROTECTED) { 85b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner // Check if the ANativeWindow sends images directly to SurfaceFlinger. 86b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar int queuesToNativeWindow = 0; 87b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = nativeWindow->query( 88b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar nativeWindow, NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, &queuesToNativeWindow); 89b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 90b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error authenticating native window: %s (%d)", strerror(-err), -err); 91b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 92b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 93b397a2a9923dcf0bec088e06df7dbe8eb128b677Craig Donner 94b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai // Check if the consumer end of the ANativeWindow can handle protected content. 95b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai int isConsumerProtected = 0; 96b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai err = nativeWindow->query( 97b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai nativeWindow, NATIVE_WINDOW_CONSUMER_IS_PROTECTED, &isConsumerProtected); 98b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai if (err != NO_ERROR) { 99b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai ALOGE("error query native window: %s (%d)", strerror(-err), -err); 100b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai return err; 101b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai } 102b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai 103b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai // Deny queuing into native window if neither condition is satisfied. 104b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai if (queuesToNativeWindow != 1 && isConsumerProtected != 1) { 105b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai ALOGE("native window cannot handle protected buffers: the consumer should either be " 106b5625ce949ceb29e5971b6e2c94d9ee054c057d7Jiwen 'Steve' Cai "a hardware composer or support hardware protection"); 107b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return PERMISSION_DENIED; 108b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 109b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 110b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 111b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar int finalUsage = usage | consumerUsage; 112b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGV("gralloc usage: %#x(producer) + %#x(consumer) = %#x", usage, consumerUsage, finalUsage); 113b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = native_window_set_usage(nativeWindow, finalUsage); 114b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 115b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 116b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 117b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 118b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 119b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = native_window_set_scaling_mode( 120b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar nativeWindow, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 121b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 122b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("native_window_set_scaling_mode failed: %s (%d)", strerror(-err), -err); 123b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 124b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 125b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 126b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGD("set up nativeWindow %p for %dx%d, color %#x, rotation %d, usage %#x", 127b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar nativeWindow, width, height, format, rotation, finalUsage); 128b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return NO_ERROR; 129b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar} 130b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 131b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnarstatus_t pushBlankBuffersToNativeWindow(ANativeWindow *nativeWindow /* nonnull */) { 132b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar status_t err = NO_ERROR; 133b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ANativeWindowBuffer* anb = NULL; 134b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar int numBufs = 0; 135b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar int minUndequeuedBufs = 0; 136b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 137b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // We need to reconnect to the ANativeWindow as a CPU client to ensure that 138b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // no frames get dropped by SurfaceFlinger assuming that these are video 139b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // frames. 140181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang err = nativeWindowDisconnect(nativeWindow, "pushBlankBuffersToNativeWindow"); 141b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 142b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", strerror(-err), -err); 143b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 144b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 145b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 146b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = native_window_api_connect(nativeWindow, NATIVE_WINDOW_API_CPU); 147b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 148b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: api_connect failed: %s (%d)", strerror(-err), -err); 149181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang (void)nativeWindowConnect(nativeWindow, "pushBlankBuffersToNativeWindow(err)"); 150b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 151b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 152b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 153b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = setNativeWindowSizeFormatAndUsage( 154098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar nativeWindow, 1, 1, HAL_PIXEL_FORMAT_RGBX_8888, 0, GRALLOC_USAGE_SW_WRITE_OFTEN, 155098446ae4100dfd989c452bb67133559aa892cd3Lajos Molnar false /* reconnect */); 156b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 157b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar goto error; 158b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 159b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 160b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar static_cast<Surface*>(nativeWindow)->getIGraphicBufferProducer()->allowAllocation(true); 161b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 162b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = nativeWindow->query(nativeWindow, 163b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs); 164b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 165b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query " 166b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar "failed: %s (%d)", strerror(-err), -err); 167b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar goto error; 168b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 169b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 170b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar numBufs = minUndequeuedBufs + 1; 171b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = native_window_set_buffer_count(nativeWindow, numBufs); 172b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 173b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: set_buffer_count failed: %s (%d)", strerror(-err), -err); 174b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar goto error; 175b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 176b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 177b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // We push numBufs + 1 buffers to ensure that we've drawn into the same 178b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // buffer twice. This should guarantee that the buffer has been displayed 179b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // on the screen and then been replaced, so an previous video frames are 180b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // guaranteed NOT to be currently displayed. 181b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar for (int i = 0; i < numBufs + 1; i++) { 182b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = native_window_dequeue_buffer_and_wait(nativeWindow, &anb); 183b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 184b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", 185b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar strerror(-err), -err); 186b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar break; 187b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 188b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 18904e331c5032609f7ed42c344780b9c1b4cfe4afbMathias Agopian sp<GraphicBuffer> buf(GraphicBuffer::from(anb)); 190b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 191b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // Fill the buffer with the a 1x1 checkerboard pattern ;) 192b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar uint32_t *img = NULL; 193b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 194b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 195b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: lock failed: %s (%d)", strerror(-err), -err); 196b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar break; 197b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 198b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 199b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar *img = 0; 200b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 201b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = buf->unlock(); 202b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 203b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: unlock failed: %s (%d)", strerror(-err), -err); 204b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar break; 205b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 206b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 207b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = nativeWindow->queueBuffer(nativeWindow, buf->getNativeBuffer(), -1); 208b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err != NO_ERROR) { 209b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: queueBuffer failed: %s (%d)", strerror(-err), -err); 210b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar break; 211b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 212b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 213b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar anb = NULL; 214b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 215b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 216b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnarerror: 217b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 218b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (anb != NULL) { 219b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar nativeWindow->cancelBuffer(nativeWindow, anb, -1); 220b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar anb = NULL; 221b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 222b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 223b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar // Clean up after success or error. 224b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar status_t err2 = native_window_api_disconnect(nativeWindow, NATIVE_WINDOW_API_CPU); 225b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err2 != NO_ERROR) { 226b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", strerror(-err2), -err2); 227b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err == NO_ERROR) { 228b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = err2; 229b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 230b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 231b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 232181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang err2 = nativeWindowConnect(nativeWindow, "pushBlankBuffersToNativeWindow(err2)"); 233b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err2 != NO_ERROR) { 234b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar ALOGE("error pushing blank frames: api_connect failed: %s (%d)", strerror(-err), -err); 235b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar if (err == NO_ERROR) { 236b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar err = err2; 237b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 238b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar } 239b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 240b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar return err; 241b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar} 242b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 243181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhangstatus_t nativeWindowConnect(ANativeWindow *surface, const char *reason) { 244181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang ALOGD("connecting to surface %p, reason %s", surface, reason); 245181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang 246181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang status_t err = native_window_api_connect(surface, NATIVE_WINDOW_API_MEDIA); 247181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang ALOGE_IF(err != OK, "Failed to connect to surface %p, err %d", surface, err); 248181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang 249181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang return err; 250181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang} 251181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang 252181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhangstatus_t nativeWindowDisconnect(ANativeWindow *surface, const char *reason) { 253181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang ALOGD("disconnecting from surface %p, reason %s", surface, reason); 254181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang 255181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang status_t err = native_window_api_disconnect(surface, NATIVE_WINDOW_API_MEDIA); 256181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang ALOGE_IF(err != OK, "Failed to disconnect from surface %p, err %d", surface, err); 257181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang 258181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang return err; 259181fd9b5b64bab24bb49a34208f60a16e98488c5Chong Zhang} 260b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar} // namespace android 261b2d0b487efd40700199852c9a18b369b1651f15bLajos Molnar 262