JPEGSource.cpp revision 2d7d46fb2d7f5f80afbf060f25ed049079fb0fc9
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 212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include "JPEGSource.h" 222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <media/stagefright/DataSource.h> 242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <media/stagefright/MediaBufferGroup.h> 252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber#include <media/stagefright/MediaDebug.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) { 622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK_EQ(parseJPEG(), OK); 632d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 642d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas HuberJPEGSource::~JPEGSource() { 662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (mStarted) { 672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber stop(); 682d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 692d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 702d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::start(MetaData *) { 722d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (mStarted) { 732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (mSource->getSize(&mSize) != OK) { 772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mGroup = new MediaBufferGroup; 812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mGroup->add_buffer(new MediaBuffer(mSize)); 822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mOffset = 0; 842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mStarted = true; 862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return OK; 882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::stop() { 912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!mStarted) { 922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber delete mGroup; 962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mGroup = NULL; 972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mStarted = false; 992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return OK; 1012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 1022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Hubersp<MetaData> JPEGSource::getFormat() { 1042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber sp<MetaData> meta = new MetaData; 1052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->setCString(kKeyMIMEType, "image/jpeg"); 1062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->setInt32(kKeyWidth, mWidth); 1072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->setInt32(kKeyHeight, mHeight); 1082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return meta; 1102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 1112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::read( 1132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaBuffer **out, const ReadOptions *options) { 1142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber *out = NULL; 1152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber int64_t seekTimeUs; 1172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (options != NULL && options->getSeekTo(&seekTimeUs)) { 1182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaBuffer *buffer; 1222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mGroup->acquire_buffer(&buffer); 1232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber ssize_t n = mSource->read_at(mOffset, buffer->data(), mSize - mOffset); 1252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (n <= 0) { 1272d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->release(); 1282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer = NULL; 1292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->set_range(0, n); 1342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mOffset += n; 1362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber *out = buffer; 1382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1392d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return OK; 1402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 1412d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::parseJPEG() { 1432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mWidth = 0; 1442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mHeight = 0; 1452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1462d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber off_t i = 0; 1472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1482d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint16_t soi; 1492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!mSource->getUInt16(i, &soi)) { 1502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += 2; 1542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (soi != 0xffd8) { 1562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (;;) { 1602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint8_t marker; 1612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (mSource->read_at(i++, &marker, 1) != 1) { 1622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1632d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1642d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK_EQ(marker, 0xff); 1662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (mSource->read_at(i++, &marker, 1) != 1) { 1682d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1692d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1702d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK(marker != 0xff); 1722d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint16_t chunkSize; 1742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!mSource->getUInt16(i, &chunkSize)) { 1752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += 2; 1792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (chunkSize < 2) { 1812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber switch (marker) { 1852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOS: 1862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 1872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return (mWidth > 0 && mHeight > 0) ? OK : UNKNOWN_ERROR; 1882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_EOI: 1912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 1922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF0: 1962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF1: 1972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF3: 1982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF5: 1992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF6: 2002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF7: 2012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF9: 2022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF10: 2032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF11: 2042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF13: 2052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF14: 2062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF15: 2072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint16_t width, height; 2092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!mSource->getUInt16(i + 1, &height) 2102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber || !mSource->getUInt16(i + 3, &width)) { 2112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 2122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mWidth = width; 2152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mHeight = height; 2162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += chunkSize - 2; 2182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber default: 2222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber // Skip chunk 2242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += chunkSize - 2; 2262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2272d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return OK; 2332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 2342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} // namespace android 236