Camera3InputStream.cpp revision 7b82efe7a376c882f8f938e1c41b8311a8cdda4a
1b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek/*
277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * Copyright (C) 2013 The Android Open Source Project
377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek *
477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * Licensed under the Apache License, Version 2.0 (the "License");
577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * you may not use this file except in compliance with the License.
677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * You may obtain a copy of the License at
777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek *
877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek *      http://www.apache.org/licenses/LICENSE-2.0
977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek *
10b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek * Unless required by applicable law or agreed to in writing, software
1141573ebf8fb971f40fa8a3e20648362c359b4916Ted Kremenek * distributed under the License is distributed on an "AS IS" BASIS,
12b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * See the License for the specific language governing permissions and
1477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * limitations under the License.
1577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek */
16d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek
17d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek#define LOG_TAG "Camera3-InputStream"
18d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek#define ATRACE_TAG ATRACE_TAG_CAMERA
19c77a55126fcad66fb086f8e100a494caa2496a2dZhongxing Xu//#define LOG_NDEBUG 0
201309f9a3b225ea846e5822691c39a77423125505Ted Kremenek
211309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include <utils/Log.h>
221309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include <utils/Trace.h>
231309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "Camera3InputStream.h"
241309f9a3b225ea846e5822691c39a77423125505Ted Kremenek
256b67630d5df195f4fe0e4273061c016901d69681Ted Kremeneknamespace android {
26c0c3f5dbc9e78aa53a86c7d5e3eeda23ddad93d6Ted Kremenek
27f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroffnamespace camera3 {
28bb141217871e93767aa3f2de1b9946fa6d37066aZhongxing Xu
2977349cb20bfd7069d081f84c91975bfa8ef60a32Ted KremenekCamera3InputStream::Camera3InputStream(int id,
301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        uint32_t width, uint32_t height, int format) :
315e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer        Camera3IOStreamBase(id, CAMERA3_STREAM_INPUT, width, height,
325e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer                            /*maxSize*/0, format) {
335e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer
34f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff    if (format == HAL_PIXEL_FORMAT_BLOB) {
351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        ALOGE("%s: Bad format, BLOB not supported", __FUNCTION__);
3625e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu        mState = STATE_ERROR;
3725e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu    }
380111f575b968e423dccae439e501225b8314b257Zhongxing Xu}
391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
40b387a3f23e423d62c053be86294b703da1d1a222Ted KremenekCamera3InputStream::~Camera3InputStream() {
41031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu    disconnectLocked();
421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
43b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek
44b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenekstatus_t Camera3InputStream::getInputBufferLocked(
45031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu        camera3_stream_buffer *buffer) {
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ATRACE_CALL();
47b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    status_t res;
484adc81e540b874bafa15715fd2c5cb662463debdTed Kremenek
49cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    // FIXME: will not work in (re-)registration
50b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    if (mState == STATE_IN_CONFIG || mState == STATE_IN_RECONFIG) {
51b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek        ALOGE("%s: Stream %d: Buffer registration for input streams"
521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump              " not implemented (state %d)",
538e5fb2849d9a8cb40d008a409273766f8ff8f854Ted Kremenek              __FUNCTION__, mId, mState);
548e5fb2849d9a8cb40d008a409273766f8ff8f854Ted Kremenek        return INVALID_OPERATION;
551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
566c07bdba93b095b66e2c8c82dd5ed458fa8285eaTed Kremenek
5706669c8e5c24251f6b140298148fbe53ab70a936Ted Kremenek    if ((res = getBufferPreconditionCheckLocked()) != OK) {
581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return res;
59846d4e923bf11bcdc2816758aafa331795f29230Ted Kremenek    }
60031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu
61846d4e923bf11bcdc2816758aafa331795f29230Ted Kremenek    ANativeWindowBuffer* anb;
62846d4e923bf11bcdc2816758aafa331795f29230Ted Kremenek    int fenceFd;
630d093d3005dd583675a45a85bd688063572cc8afTed Kremenek
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    assert(mConsumer != 0);
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    BufferItem bufferItem;
6703509aea098772644bf4662dc1c88634818ceeccZhongxing Xu    res = mConsumer->acquireBuffer(&bufferItem, /*waitForFence*/false);
681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek    if (res != OK) {
70e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek        ALOGE("%s: Stream %d: Can't acquire next output buffer: %s (%d)",
711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                __FUNCTION__, mId, strerror(-res), res);
72e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek        return res;
73e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek    }
74e448ab4f9dd162802f5d7cfea60f7830cc61c654Ted Kremenek
751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    anb = bufferItem.mGraphicBuffer->getNativeBuffer();
76bdb435ddaafd5069becd543d638112f68825b89dTed Kremenek    assert(anb != NULL);
77ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu    fenceFd = bufferItem.mFence->dup();
78094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek
79b94b81a9ab46c99b00c7ad28c5e1e212c63fc9acZhongxing Xu    /**
809e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek     * FenceFD now owned by HAL except in case of error,
819e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek     * in which case we reassign it to acquire_fence
829e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek     */
839e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek    handoutBufferLocked(*buffer, &(anb->handle), /*acquireFence*/fenceFd,
849e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek                        /*releaseFence*/-1, CAMERA3_BUFFER_STATUS_OK);
859e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek    mBuffersInFlight.push_back(bufferItem);
869e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek
879e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek    return OK;
889e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek}
89094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek
90ff944a8c481d6c0f1ad2633e4be9bf8b1dd2a09fZhongxing Xustatus_t Camera3InputStream::returnBufferCheckedLocked(
919e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek            const camera3_stream_buffer &buffer,
929e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek            nsecs_t timestamp,
939e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek            bool output,
949e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek            /*out*/
959e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek            sp<Fence> *releaseFenceOut) {
969e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek
979e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek    (void)timestamp;
98cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    (void)output;
9932a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek    ALOG_ASSERT(!output, "Expected output to be false");
10032a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek
1011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    status_t res;
102cb7464ab402d057849dda9749d62a62d86c35ab8Zhongxing Xu
103cb7464ab402d057849dda9749d62a62d86c35ab8Zhongxing Xu    bool bufferFound = false;
10403509aea098772644bf4662dc1c88634818ceeccZhongxing Xu    BufferItem bufferItem;
105cb7464ab402d057849dda9749d62a62d86c35ab8Zhongxing Xu    {
106cb7464ab402d057849dda9749d62a62d86c35ab8Zhongxing Xu        // Find the buffer we are returning
10703509aea098772644bf4662dc1c88634818ceeccZhongxing Xu        Vector<BufferItem>::iterator it, end;
108cb7464ab402d057849dda9749d62a62d86c35ab8Zhongxing Xu        for (it = mBuffersInFlight.begin(), end = mBuffersInFlight.end();
109cb7464ab402d057849dda9749d62a62d86c35ab8Zhongxing Xu             it != end;
110cb7464ab402d057849dda9749d62a62d86c35ab8Zhongxing Xu             ++it) {
111b22d589e2ccd09cada0bcea136f0966883a8bb11Ted Kremenek
11232a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek            const BufferItem& tmp = *it;
113cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek            ANativeWindowBuffer *anb = tmp.mGraphicBuffer->getNativeBuffer();
11450a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek            if (anb != NULL && &(anb->handle) == buffer.buffer) {
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                bufferFound = true;
11625e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu                bufferItem = tmp;
1172ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu                mBuffersInFlight.erase(it);
1182ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu                mDequeuedBufferCount--;
1192ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu            }
1202ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu        }
1212ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    }
1222ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    if (!bufferFound) {
1232ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu        ALOGE("%s: Stream %d: Can't return buffer that wasn't sent to HAL",
1242ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu              __FUNCTION__, mId);
1252ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu        return INVALID_OPERATION;
1262ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    }
127b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (buffer.status == CAMERA3_BUFFER_STATUS_ERROR) {
129b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek        if (buffer.release_fence != -1) {
130c77a55126fcad66fb086f8e100a494caa2496a2dZhongxing Xu            ALOGE("%s: Stream %d: HAL should not set release_fence(%d) when "
1315032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu                  "there is an error", __FUNCTION__, mId, buffer.release_fence);
1322ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu            close(buffer.release_fence);
1331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        }
13432c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek
1351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        /**
13632a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek         * Reassign release fence as the acquire fence incase of error
1371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump         */
138cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek        const_cast<camera3_stream_buffer*>(&buffer)->release_fence =
1391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                buffer.acquire_fence;
140ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu    }
141ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu
14232a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek    /**
14332a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek     * Unconditionally return buffer to the buffer queue.
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump     * - Fwk takes over the release_fence ownership
145e01c98767dfd7153c3c84637c36659e3bbe16ff7Ted Kremenek     */
146e01c98767dfd7153c3c84637c36659e3bbe16ff7Ted Kremenek    sp<Fence> releaseFence = new Fence(buffer.release_fence);
147ffe0f43806d4823271c2406c1fccc2373115c36aTed Kremenek    res = mConsumer->releaseBuffer(bufferItem, releaseFence);
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (res != OK) {
149031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu        ALOGE("%s: Stream %d: Error releasing buffer back to buffer queue:"
1501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                " %s (%d)", __FUNCTION__, mId, strerror(-res), res);
151b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek        return res;
152b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    }
15317fd8632dcda97022a51effc24060eacdad9dbe0Zhongxing Xu
1541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    *releaseFenceOut = releaseFence;
155031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu
156031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu    return OK;
15750a6d0ce344c02782e0207574005c3b2aaa5077cTed Kremenek}
158ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu
159094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenekstatus_t Camera3InputStream::returnInputBufferLocked(
160094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek        const camera3_stream_buffer &buffer) {
161094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek    ATRACE_CALL();
162094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek
163094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek    return returnAnyBufferLocked(buffer, /*timestamp*/0, /*output*/false);
164ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu}
165094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek
166094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenekstatus_t Camera3InputStream::disconnectLocked() {
167ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu
168ec9227fea66c3439991fc84b0d33b0a8b4b8875eZhongxing Xu    status_t res;
169094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek
170094bef56a7900f13bb777f9a352704104b1458e7Ted Kremenek    if ((res = Camera3IOStreamBase::disconnectLocked()) != OK) {
1715a5d98bc6962dc2d1aaa5e0e522f1bf84273b9c1Ted Kremenek        return res;
1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
173bdb435ddaafd5069becd543d638112f68825b89dTed Kremenek
174536aa02b29ea2bdffff2cc507ed04f6b56737116Ted Kremenek    assert(mBuffersInFlight.size() == 0);
1751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
176b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    /**
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump     *  no-op since we can't disconnect the producer from the consumer-side
17803509aea098772644bf4662dc1c88634818ceeccZhongxing Xu     */
1791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1806a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek    mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG
1816a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek                                           : STATE_CONSTRUCTED;
1826a6719a3a11087b48d9f1a4eb08b3bd43cb05a65Ted Kremenek    return OK;
18303509aea098772644bf4662dc1c88634818ceeccZhongxing Xu}
1844323a57627e796dcfdfdb7d47672dc09ed308edaTed Kremenek
1851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpsp<IGraphicBufferProducer> Camera3InputStream::getProducerInterface() const {
186b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    return mConsumer->getProducerInterface();
187b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek}
18803509aea098772644bf4662dc1c88634818ceeccZhongxing Xu
18903509aea098772644bf4662dc1c88634818ceeccZhongxing Xuvoid Camera3InputStream::dump(int fd, const Vector<String16> &args) const {
1901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    (void) args;
191b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    String8 lines;
192b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    lines.appendFormat("    Stream[%d]: Input\n", mId);
193031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu    write(fd, lines.string(), lines.size());
1941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
195b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    Camera3IOStreamBase::dump(fd, args);
196b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek}
197031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatus_t Camera3InputStream::configureQueueLocked() {
19911062b118476368fa5b294954713e5df97d8599fTed Kremenek    status_t res;
20011062b118476368fa5b294954713e5df97d8599fTed Kremenek
20173099bfea9f5d4ec05265170bbefec3d76fb6b5eTed Kremenek    if ((res = Camera3IOStreamBase::configureQueueLocked()) != OK) {
202102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor        return res;
203ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek    }
204102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor
205102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor    assert(mMaxSize == 0);
206ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek    assert(camera3_stream::format != HAL_PIXEL_FORMAT_BLOB);
207102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor
208102acd5369bbb17c0d6ab868af376671acff7a93Douglas Gregor    mTotalBufferCount = BufferQueue::MIN_UNDEQUEUED_BUFFERS +
209ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek                        camera3_stream::max_buffers;
210ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek    mDequeuedBufferCount = 0;
211ccc263b44c62ce3a02f797a3ddb3d6017cf0e5e4Ted Kremenek    mFrameCount = 0;
21232a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek
21332a58084a4c53e6938dd81bfce224db25a5976d1Ted Kremenek    if (mConsumer.get() == 0) {
21403509aea098772644bf4662dc1c88634818ceeccZhongxing Xu        sp<BufferQueue> bq = new BufferQueue();
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        mConsumer = new BufferItemConsumer(bq, camera3_stream::usage,
2162ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu                                           mTotalBufferCount);
21790e72e4106a0c3efa7575e9f9cba0c775bb54552Zhongxing Xu        mConsumer->setName(String8::format("Camera3-InputStream-%d", mId));
21890e72e4106a0c3efa7575e9f9cba0c775bb54552Zhongxing Xu    }
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
220a516ce16b472e61924f5dd10d181c3e8330979afTed Kremenek    res = mConsumer->setDefaultBufferSize(camera3_stream::width,
221a516ce16b472e61924f5dd10d181c3e8330979afTed Kremenek                                          camera3_stream::height);
222a516ce16b472e61924f5dd10d181c3e8330979afTed Kremenek    if (res != OK) {
2231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        ALOGE("%s: Stream %d: Could not set buffer dimensions %dx%d",
224044b6f0417cb98741f277602fabf5f07ec9a02c0Ted Kremenek              __FUNCTION__, mId, camera3_stream::width, camera3_stream::height);
2256297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek        return res;
2266297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek    }
2276297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek    res = mConsumer->setDefaultBufferFormat(camera3_stream::format);
2286297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek    if (res != OK) {
2296297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek        ALOGE("%s: Stream %d: Could not set buffer format %d",
2306297a8ec313c722db50f686fd190842b7ea91118Ted Kremenek              __FUNCTION__, mId, camera3_stream::format);
2311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return res;
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
2338e5fb2849d9a8cb40d008a409273766f8ff8f854Ted Kremenek
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return OK;
235044b6f0417cb98741f277602fabf5f07ec9a02c0Ted Kremenek}
23600a3a5f024ac54088ab887712b292171188064f0Ted Kremenek
23700a3a5f024ac54088ab887712b292171188064f0Ted Kremenek}; // namespace camera3
2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23905a2378c708688c8ef498a5cea40ed7f5db15fa5Ted Kremenek}; // namespace android
240031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu