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