JPEGSource.cpp revision 7530e9c708275c273c134c36c68179f511c1940e
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); 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; 1022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->setCString(kKeyMIMEType, "image/jpeg"); 1032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->setInt32(kKeyWidth, mWidth); 1042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber meta->setInt32(kKeyHeight, mHeight); 1057530e9c708275c273c134c36c68179f511c1940eAndreas Huber meta->setInt32(kKeyCompressedSize, 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; 1152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (options != NULL && options->getSeekTo(&seekTimeUs)) { 1162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber MediaBuffer *buffer; 1202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mGroup->acquire_buffer(&buffer); 1212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber ssize_t n = mSource->read_at(mOffset, buffer->data(), mSize - mOffset); 1232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (n <= 0) { 1252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->release(); 1262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer = NULL; 1272d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber buffer->set_range(0, n); 1322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mOffset += n; 1342d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1352d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber *out = buffer; 1362d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1372d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return OK; 1382d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 1392d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1402d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huberstatus_t JPEGSource::parseJPEG() { 1412d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mWidth = 0; 1422d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mHeight = 0; 1432d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1442d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber off_t i = 0; 1452d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1462d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint16_t soi; 1472d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!mSource->getUInt16(i, &soi)) { 1482d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1492d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1502d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1512d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += 2; 1522d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1532d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (soi != 0xffd8) { 1542d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1552d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1562d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1572d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber for (;;) { 1582d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint8_t marker; 1592d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (mSource->read_at(i++, &marker, 1) != 1) { 1602d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1612d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1622d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1632d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK_EQ(marker, 0xff); 1642d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1652d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (mSource->read_at(i++, &marker, 1) != 1) { 1662d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1672d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1682d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1692d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber CHECK(marker != 0xff); 1702d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1712d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint16_t chunkSize; 1722d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!mSource->getUInt16(i, &chunkSize)) { 1732d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 1742d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1752d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1762d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += 2; 1772d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1782d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (chunkSize < 2) { 1792d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1802d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1812d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1822d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber switch (marker) { 1832d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOS: 1842d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 1852d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return (mWidth > 0 && mHeight > 0) ? OK : UNKNOWN_ERROR; 1862d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1872d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1882d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_EOI: 1892d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 1902d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return UNKNOWN_ERROR; 1912d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 1922d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 1932d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF0: 1942d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF1: 1952d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF3: 1962d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF5: 1972d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF6: 1982d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF7: 1992d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF9: 2002d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF10: 2012d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF11: 2022d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF13: 2032d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF14: 2042d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber case JPEG_SOF15: 2052d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2062d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber uint16_t width, height; 2072d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber if (!mSource->getUInt16(i + 1, &height) 2082d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber || !mSource->getUInt16(i + 3, &width)) { 2092d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return ERROR_IO; 2102d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2112d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2122d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mWidth = width; 2132d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber mHeight = height; 2142d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2152d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += chunkSize - 2; 2162d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2172d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2182d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2192d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber default: 2202d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber { 2212d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber // Skip chunk 2222d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2232d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber i += chunkSize - 2; 2242d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2252d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber break; 2262d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2272d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2282d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber } 2292d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2302d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber return OK; 2312d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} 2322d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber 2332d7d46fb2d7f5f80afbf060f25ed049079fb0fc9Andreas Huber} // namespace android 234