1bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray/*
2bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * Copyright (C) 2013 The Android Open Source Project
3bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray *
4bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * Licensed under the Apache License, Version 2.0 (the "License");
5bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * you may not use this file except in compliance with the License.
6bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * You may obtain a copy of the License at
7bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray *
8bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray *      http://www.apache.org/licenses/LICENSE-2.0
9bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray *
10bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * Unless required by applicable law or agreed to in writing, software
11bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * distributed under the License is distributed on an "AS IS" BASIS,
12bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * See the License for the specific language governing permissions and
14bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray * limitations under the License.
15bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray */
16bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
1769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray#include <stdio.h>
18bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#include <hardware/camera3.h>
19bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#include <hardware/gralloc.h>
20bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#include <system/graphics.h>
21555676430e4682514681e95fdc2891a8a09bfe03Alex Ray#include <utils/Mutex.h>
22bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
23bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray//#define LOG_NDEBUG 0
24bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#define LOG_TAG "Stream"
25bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#include <cutils/log.h>
26bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
27bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
28ea80382be17ab288622506475b8f15d9d8ebee80Alex Ray#include <utils/Trace.h>
29bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
30bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray#include "Stream.h"
31bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
32bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Raynamespace default_camera_hal {
33bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
34bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex RayStream::Stream(int id, camera3_stream_t *s)
35bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray  : mReuse(false),
36bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mId(id),
37bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mStream(s),
38bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mType(s->stream_type),
39bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mWidth(s->width),
40bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mHeight(s->height),
41bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mFormat(s->format),
42bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mUsage(0),
43bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    mMaxBuffers(0),
448a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mRegistered(false),
458a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mBuffers(0),
468a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mNumBuffers(0)
47bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
48bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
49bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
50bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex RayStream::~Stream()
51bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
52555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mLock);
538a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    unregisterBuffers_L();
54bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
55bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
56bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Rayvoid Stream::setUsage(uint32_t usage)
57bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
58555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mLock);
59bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (usage != mUsage) {
60bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        mUsage = usage;
612b286dab84b2a0524c1deed67fea92200e598c6eAlex Ray        mStream->usage = usage;
628a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        unregisterBuffers_L();
63bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
64bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
65bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
66bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Rayvoid Stream::setMaxBuffers(uint32_t max_buffers)
67bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
68555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mLock);
69bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (max_buffers != mMaxBuffers) {
70bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        mMaxBuffers = max_buffers;
712b286dab84b2a0524c1deed67fea92200e598c6eAlex Ray        mStream->max_buffers = max_buffers;
728a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        unregisterBuffers_L();
73bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
74bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
75bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
76bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Rayint Stream::getType()
77bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
78bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    return mType;
79bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
80bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
81bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Raybool Stream::isInputType()
82bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
83768216ee2c90ecbbc73121b528e60c82ff668eb5Alex Ray    return mType == CAMERA3_STREAM_INPUT ||
84768216ee2c90ecbbc73121b528e60c82ff668eb5Alex Ray        mType == CAMERA3_STREAM_BIDIRECTIONAL;
85bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
86bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
87bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Raybool Stream::isOutputType()
88bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
89768216ee2c90ecbbc73121b528e60c82ff668eb5Alex Ray    return mType == CAMERA3_STREAM_OUTPUT ||
90768216ee2c90ecbbc73121b528e60c82ff668eb5Alex Ray        mType == CAMERA3_STREAM_BIDIRECTIONAL;
91bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
92bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
9369f1f9166adea3579353fd3bc14b6a23c43de024Alex Rayconst char* Stream::typeToString(int type)
9469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray{
9569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    switch (type) {
9669f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case CAMERA3_STREAM_INPUT:
9769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "CAMERA3_STREAM_INPUT";
9869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case CAMERA3_STREAM_OUTPUT:
9969f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "CAMERA3_STREAM_OUTPUT";
10069f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case CAMERA3_STREAM_BIDIRECTIONAL:
10169f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "CAMERA3_STREAM_BIDIRECTIONAL";
10269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    }
10369f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    return "Invalid stream type!";
10469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray}
10569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray
10669f1f9166adea3579353fd3bc14b6a23c43de024Alex Rayconst char* Stream::formatToString(int format)
10769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray{
10869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    // See <system/graphics.h> for full list
10969f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    switch (format) {
11069f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_BGRA_8888:
11169f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "BGRA 8888";
11269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_RGBA_8888:
11369f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "RGBA 8888";
11469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_RGBX_8888:
11569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "RGBX 8888";
11669f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_RGB_888:
11769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "RGB 888";
11869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_RGB_565:
11969f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "RGB 565";
12069f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_sRGB_A_8888:
12169f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "sRGB A 8888";
12269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_sRGB_X_8888:
12369f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "sRGB B 8888";
12469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_Y8:
12569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "Y8";
12669f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_Y16:
12769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "Y16";
12869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_YV12:
12969f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "YV12";
13069f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_YCbCr_422_SP:
13169f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "NV16";
13269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_YCrCb_420_SP:
13369f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "NV21";
13469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_YCbCr_422_I:
13569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "YUY2";
13669f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_RAW_SENSOR:
13769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "RAW SENSOR";
13869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_BLOB:
13969f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "BLOB";
14069f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
14169f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "IMPLEMENTATION DEFINED";
14269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    case HAL_PIXEL_FORMAT_YCbCr_420_888:
14369f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        return "FLEXIBLE YCbCr 420 888";
14469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    }
14569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    return "Invalid stream format!";
14669f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray}
14769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray
1488a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Raybool Stream::isRegistered()
1498a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray{
1508a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    return mRegistered;
1518a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray}
1528a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray
153bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Raybool Stream::isValidReuseStream(int id, camera3_stream_t *s)
154bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray{
155bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (id != mId) {
156bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Invalid camera id for reuse. Got %d expect %d",
157bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray                __func__, mId, id, mId);
158bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
159bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
160bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (s != mStream) {
161bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Invalid stream handle for reuse. Got %p expect %p",
162bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray                __func__, mId, s, mStream);
163bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
164bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
165bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (s->stream_type != mType) {
16669f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        ALOGE("%s:%d: Mismatched type in reused stream. Got %s(%d) "
16769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray                "expect %s(%d)", __func__, mId, typeToString(s->stream_type),
16869f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray                s->stream_type, typeToString(mType), mType);
169bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
170bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
171bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (s->format != mFormat) {
17269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray        ALOGE("%s:%d: Mismatched format in reused stream. Got %s(%d) "
17369f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray                "expect %s(%d)", __func__, mId, formatToString(s->format),
17469f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray                s->format, formatToString(mFormat), mFormat);
175bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
176bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
177bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (s->width != mWidth) {
178bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Mismatched width in reused stream. Got %d expect %d",
179bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray                __func__, mId, s->width, mWidth);
180bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
181bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
182bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    if (s->height != mHeight) {
183bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        ALOGE("%s:%d: Mismatched height in reused stream. Got %d expect %d",
184bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray                __func__, mId, s->height, mHeight);
185bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray        return false;
186bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    }
187bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray    return true;
188bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray}
189bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray
1908a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Rayint Stream::registerBuffers(const camera3_stream_buffer_set_t *buf_set)
1918a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray{
192ea80382be17ab288622506475b8f15d9d8ebee80Alex Ray    ATRACE_CALL();
193555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mLock);
1948a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray
1958a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    if (buf_set->stream != mStream) {
1968a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        ALOGE("%s:%d: Buffer set for invalid stream. Got %p expect %p",
1978a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray                __func__, mId, buf_set->stream, mStream);
1988a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        return -EINVAL;
1998a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    }
2008a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray
2018a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mNumBuffers = buf_set->num_buffers;
2028a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mBuffers = new buffer_handle_t*[mNumBuffers];
2038a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray
2048a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    for (unsigned int i = 0; i < mNumBuffers; i++) {
2058a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        ALOGV("%s:%d: Registering buffer %p", __func__, mId,
2068a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray                buf_set->buffers[i]);
2078a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        mBuffers[i] = buf_set->buffers[i];
2088a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray        // TODO: register buffers with hw, handle error cases
2098a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    }
2108a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mRegistered = true;
2118a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray
2128a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    return 0;
2138a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray}
2148a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray
215555676430e4682514681e95fdc2891a8a09bfe03Alex Ray// This must only be called with mLock held
2168a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Rayvoid Stream::unregisterBuffers_L()
2178a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray{
2188a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mRegistered = false;
2198a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    mNumBuffers = 0;
2208a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    delete [] mBuffers;
2218a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray    // TODO: unregister buffers from hw
2228a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray}
2238a8f86bbe6cd0d62c81b7f0f7414b74e1aa20f37Alex Ray
22469f1f9166adea3579353fd3bc14b6a23c43de024Alex Rayvoid Stream::dump(int fd)
22569f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray{
226555676430e4682514681e95fdc2891a8a09bfe03Alex Ray    android::Mutex::Autolock al(mLock);
22769f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray
2280d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Stream ID: %d (%p)\n", mId, mStream);
2290d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Stream Type: %s (%d)\n", typeToString(mType), mType);
2300d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Width: %"PRIu32" Height: %"PRIu32"\n", mWidth, mHeight);
2310d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Stream Format: %s (%d)", formatToString(mFormat), mFormat);
23269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    // ToDo: prettyprint usage mask flags
2330d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Gralloc Usage Mask: %#"PRIx32"\n", mUsage);
2340d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Max Buffer Count: %"PRIu32"\n", mMaxBuffers);
2350d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Buffers Registered: %s\n", mRegistered ? "true" : "false");
2360d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes    dprintf(fd, "Number of Buffers: %"PRIu32"\n", mNumBuffers);
237a82f456c387cb6ff6c5aab7c930a7a61c36ed8baSasha Levitskiy    for (uint32_t i = 0; i < mNumBuffers; i++) {
2380d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes        dprintf(fd, "Buffer %"PRIu32"/%"PRIu32": %p\n", i, mNumBuffers,
2390d1c2a49d675945a34baca364d68c396f03cc3e8Elliott Hughes                mBuffers[i]);
24069f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray    }
24169f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray}
24269f1f9166adea3579353fd3bc14b6a23c43de024Alex Ray
243bcaf788434b0f4fcc4f194ca01d94cd59eb912a9Alex Ray} // namespace default_camera_hal
244