12d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber/*
22d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * Copyright (C) 2009 The Android Open Source Project
32d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber *
42d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
52d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * you may not use this file except in compliance with the License.
62d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * You may obtain a copy of the License at
72d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber *
82d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
92d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber *
102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * Unless required by applicable law or agreed to in writing, software
112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * See the License for the specific language governing permissions and
142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber * limitations under the License.
152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber */
162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber// #define LOG_NDEBUG   0
182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define LOG_TAG "JPEGSource"
192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <utils/Log.h>
202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
21f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h>
222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <media/stagefright/DataSource.h>
23777893a928680f09e306b4b9efc1d5cf4479a9daAndreas Huber#include <media/stagefright/JPEGSource.h>
242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <media/stagefright/MediaBufferGroup.h>
2518291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber#include <media/stagefright/MediaDefs.h>
262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <media/stagefright/MediaErrors.h>
272d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <media/stagefright/MetaData.h>
282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF0  0xC0            /* nStart Of Frame N*/
302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF1  0xC1            /* N indicates which compression process*/
312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF2  0xC2            /* Only SOF0-SOF2 are now in common use*/
322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF3  0xC3
332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF5  0xC5            /* NB: codes C4 and CC are NOT SOF markers*/
342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF6  0xC6
352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF7  0xC7
362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF9  0xC9
372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF10 0xCA
382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF11 0xCB
392d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF13 0xCD
402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF14 0xCE
412d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOF15 0xCF
422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOI   0xD8            /* nStart Of Image (beginning of datastream)*/
432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_EOI   0xD9            /* End Of Image (end of datastream)*/
442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_SOS   0xDA            /* nStart Of Scan (begins compressed data)*/
452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_JFIF  0xE0            /* Jfif marker*/
462d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_EXIF  0xE1            /* Exif marker*/
472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_COM   0xFE            /* COMment */
482d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_DQT   0xDB
492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_DHT   0xC4
502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#define JPEG_DRI   0xDD
512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Hubernamespace android {
532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas HuberJPEGSource::JPEGSource(const sp<DataSource> &source)
552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    : mSource(source),
562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber      mGroup(NULL),
572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber      mStarted(false),
582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber      mSize(0),
592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber      mWidth(0),
602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber      mHeight(0),
612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber      mOffset(0) {
62f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong    CHECK_EQ(parseJPEG(), (status_t)OK);
637530e9c708275c273c134c36c68179f511c1940eAndreas Huber    CHECK(mSource->getSize(&mSize) == OK);
642d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}
652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas HuberJPEGSource::~JPEGSource() {
672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    if (mStarted) {
682d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        stop();
692d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
702d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}
712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
722d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::start(MetaData *) {
732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    if (mStarted) {
742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        return UNKNOWN_ERROR;
752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mGroup = new MediaBufferGroup;
782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mGroup->add_buffer(new MediaBuffer(mSize));
792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mOffset = 0;
812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mStarted = true;
832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    return OK;
852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}
862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::stop() {
882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    if (!mStarted) {
892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        return UNKNOWN_ERROR;
902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    delete mGroup;
932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mGroup = NULL;
942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mStarted = false;
962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    return OK;
982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}
992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Hubersp<MetaData> JPEGSource::getFormat() {
1012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    sp<MetaData> meta = new MetaData;
10218291bc20e55e8f3fd5feb786771a8ed32c19c59Andreas Huber    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_IMAGE_JPEG);
1032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    meta->setInt32(kKeyWidth, mWidth);
1042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    meta->setInt32(kKeyHeight, mHeight);
105e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    meta->setInt32(kKeyMaxInputSize, mSize);
1062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    return meta;
1082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}
1092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::read(
1112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        MediaBuffer **out, const ReadOptions *options) {
1122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    *out = NULL;
1132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    int64_t seekTimeUs;
115abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber    ReadOptions::SeekMode mode;
116abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber    if (options != NULL && options->getSeekTo(&seekTimeUs, &mode)) {
1172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        return UNKNOWN_ERROR;
1182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
1192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    MediaBuffer *buffer;
1212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mGroup->acquire_buffer(&buffer);
1222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
12334769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber    ssize_t n = mSource->readAt(mOffset, buffer->data(), mSize - mOffset);
1242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    if (n <= 0) {
1262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        buffer->release();
1272d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        buffer = NULL;
1282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        return UNKNOWN_ERROR;
1302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
1312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    buffer->set_range(0, n);
1332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mOffset += n;
1352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    *out = buffer;
1372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    return OK;
1392d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}
1402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1412d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::parseJPEG() {
1422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mWidth = 0;
1432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    mHeight = 0;
1442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
145c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t i = 0;
1462d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    uint16_t soi;
1482d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    if (!mSource->getUInt16(i, &soi)) {
1492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        return ERROR_IO;
1502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
1512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    i += 2;
1532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    if (soi != 0xffd8) {
1552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        return UNKNOWN_ERROR;
1562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
1572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    for (;;) {
1592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        uint8_t marker;
16034769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber        if (mSource->readAt(i++, &marker, 1) != 1) {
1612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            return ERROR_IO;
1622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        }
1632d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1642d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        CHECK_EQ(marker, 0xff);
1652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
16634769bc913e9f6bb138e666d94a9d685bf3da217Andreas Huber        if (mSource->readAt(i++, &marker, 1) != 1) {
1672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            return ERROR_IO;
1682d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        }
1692d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1702d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        CHECK(marker != 0xff);
1712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1722d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        uint16_t chunkSize;
1732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        if (!mSource->getUInt16(i, &chunkSize)) {
1742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            return ERROR_IO;
1752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        }
1762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        i += 2;
1782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        if (chunkSize < 2) {
1802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            return UNKNOWN_ERROR;
1812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        }
1822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        switch (marker) {
1842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOS:
1852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            {
1862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                return (mWidth > 0 && mHeight > 0) ? OK : UNKNOWN_ERROR;
1872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            }
1882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_EOI:
1902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            {
1912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                return UNKNOWN_ERROR;
1922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            }
1932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
1942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF0:
1952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF1:
1962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF3:
1972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF5:
1982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF6:
1992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF7:
2002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF9:
2012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF10:
2022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF11:
2032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF13:
2042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF14:
2052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            case JPEG_SOF15:
2062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            {
2072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                uint16_t width, height;
2082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                if (!mSource->getUInt16(i + 1, &height)
2092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                    || !mSource->getUInt16(i + 3, &width)) {
2102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                    return ERROR_IO;
2112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                }
2122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
2132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                mWidth = width;
2142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                mHeight = height;
2152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
2162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                i += chunkSize - 2;
2172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                break;
2182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            }
2192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
2202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            default:
2212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            {
2222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                // Skip chunk
2232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
2242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                i += chunkSize - 2;
2252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
2262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber                break;
2272d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber            }
2282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber        }
2292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    }
2302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
2312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber    return OK;
2322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}
2332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber
2342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber}  // namespace android
235