StagefrightMediaScanner.cpp revision 7188e55f54a43c55fd6b96454720c447f1dc454e
167e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber/*
267e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * Copyright (C) 2009 The Android Open Source Project
367e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber *
467e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
567e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * you may not use this file except in compliance with the License.
667e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * You may obtain a copy of the License at
767e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber *
867e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
967e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber *
1067e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * Unless required by applicable law or agreed to in writing, software
1167e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1267e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1367e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * See the License for the specific language governing permissions and
1467e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber * limitations under the License.
1567e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber */
1667e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
17fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber//#define LOG_NDEBUG 0
18fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#define LOG_TAG "StagefrightMediaScanner"
19fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#include <utils/Log.h>
20fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
2167e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber#include <media/stagefright/StagefrightMediaScanner.h>
2267e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
232e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber#include <media/mediametadataretriever.h>
242e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber#include <private/media/VideoFrame.h>
2567e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
26fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber// Sonivox includes
27fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#include <libsonivox/eas.h>
28fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
2967e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Hubernamespace android {
3067e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
310a095d09464ba18e288a3f529410af0f1257ac2aMike LockwoodStagefrightMediaScanner::StagefrightMediaScanner() {}
3267e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
3367e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas HuberStagefrightMediaScanner::~StagefrightMediaScanner() {}
3467e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
35fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huberstatic bool FileHasAcceptableExtension(const char *extension) {
36fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    static const char *kValidExtensions[] = {
37fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        ".mp3", ".mp4", ".m4a", ".3gp", ".3gpp", ".3g2", ".3gpp2",
38fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        ".mpeg", ".ogg", ".mid", ".smf", ".imy", ".wma", ".aac",
39093437c388e5dff6903a3d43f2ca9f8a1ba4744aAndreas Huber        ".wav", ".amr", ".midi", ".xmf", ".rtttl", ".rtx", ".ota",
408d30cc86d36c5e2d7d8defab8f58faed4139ed7fAndreas Huber        ".mkv", ".mka", ".webm", ".ts", ".fl", ".flac", ".mxmf",
41f8374dec590223ebdd6959b26d9ba90749dd8328Andreas Huber        ".avi",
42fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    };
43fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    static const size_t kNumValidExtensions =
44fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        sizeof(kValidExtensions) / sizeof(kValidExtensions[0]);
45fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
46fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    for (size_t i = 0; i < kNumValidExtensions; ++i) {
47fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        if (!strcasecmp(extension, kValidExtensions[i])) {
48fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            return true;
49fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        }
50fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
51fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
52fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    return false;
53fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber}
54fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
557188e55f54a43c55fd6b96454720c447f1dc454eJeff Brownstatic MediaScanResult HandleMIDI(
56fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        const char *filename, MediaScannerClient *client) {
57fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    // get the library configuration and do sanity check
58fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    const S_EAS_LIB_CONFIG* pLibConfig = EAS_Config();
59fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if ((pLibConfig == NULL) || (LIB_VERSION != pLibConfig->libVersion)) {
60fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        LOGE("EAS library/header mismatch\n");
617188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        return MEDIA_SCAN_RESULT_ERROR;
62fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
63fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    EAS_I32 temp;
64fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
65fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    // spin up a new EAS engine
66fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    EAS_DATA_HANDLE easData = NULL;
67fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    EAS_HANDLE easHandle = NULL;
68fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    EAS_RESULT result = EAS_Init(&easData);
69fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (result == EAS_SUCCESS) {
70fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        EAS_FILE file;
71fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        file.path = filename;
72fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        file.fd = 0;
73fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        file.offset = 0;
74fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        file.length = 0;
75fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        result = EAS_OpenFile(easData, &file, &easHandle);
76fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
77fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (result == EAS_SUCCESS) {
78fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        result = EAS_Prepare(easData, easHandle);
79fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
80fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (result == EAS_SUCCESS) {
81fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        result = EAS_ParseMetaData(easData, easHandle, &temp);
82fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
83fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (easHandle) {
84fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        EAS_CloseFile(easData, easHandle);
85fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
86fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (easData) {
87fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        EAS_Shutdown(easData);
88fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
89fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
90fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (result != EAS_SUCCESS) {
917188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        return MEDIA_SCAN_RESULT_SKIPPED;
92fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
93fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
94fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    char buffer[20];
95fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    sprintf(buffer, "%ld", temp);
967188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    status_t status = client->addStringTag("duration", buffer);
977188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    if (status) {
987188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        return MEDIA_SCAN_RESULT_ERROR;
997188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    }
1007188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    return MEDIA_SCAN_RESULT_OK;
101fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber}
102fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
1037188e55f54a43c55fd6b96454720c447f1dc454eJeff BrownMediaScanResult StagefrightMediaScanner::processFile(
10467e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber        const char *path, const char *mimeType,
10567e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber        MediaScannerClient &client) {
1062e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber    LOGV("processFile '%s'.", path);
1072e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber
10867e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber    client.setLocale(locale());
10967e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber    client.beginFile();
1107188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    MediaScanResult result = processFileInternal(path, mimeType, client);
1117188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    client.endFile();
1127188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    return result;
1137188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown}
11467e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
1157188e55f54a43c55fd6b96454720c447f1dc454eJeff BrownMediaScanResult StagefrightMediaScanner::processFileInternal(
1167188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        const char *path, const char *mimeType,
1177188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        MediaScannerClient &client) {
118fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    const char *extension = strrchr(path, '.');
119fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
120fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (!extension) {
1217188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        return MEDIA_SCAN_RESULT_SKIPPED;
122fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
123fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
124fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (!FileHasAcceptableExtension(extension)) {
1257188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        return MEDIA_SCAN_RESULT_SKIPPED;
126fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
127fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
128fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (!strcasecmp(extension, ".mid")
129fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            || !strcasecmp(extension, ".smf")
130fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            || !strcasecmp(extension, ".imy")
131fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            || !strcasecmp(extension, ".midi")
132fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            || !strcasecmp(extension, ".xmf")
133fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            || !strcasecmp(extension, ".rtttl")
134fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            || !strcasecmp(extension, ".rtx")
1358d30cc86d36c5e2d7d8defab8f58faed4139ed7fAndreas Huber            || !strcasecmp(extension, ".ota")
1368d30cc86d36c5e2d7d8defab8f58faed4139ed7fAndreas Huber            || !strcasecmp(extension, ".mxmf")) {
1377188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        return HandleMIDI(path, &client);
1387188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    }
1397188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown
1407188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever);
1417188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown
1427188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    status_t status = mRetriever->setDataSource(path);
1437188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    if (status) {
1447188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        return MEDIA_SCAN_RESULT_ERROR;
1457188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    }
1467188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown
1477188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    const char *value;
1487188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    if ((value = mRetriever->extractMetadata(
1497188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown                    METADATA_KEY_MIMETYPE)) != NULL) {
1507188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        status = client.setMimeType(value);
1517188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        if (status) {
1527188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown            return MEDIA_SCAN_RESULT_ERROR;
1536ed70d2d41f9929d1c3f5179d947766495f9efe5Hiroshi Takekawa        }
1547188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    }
1550a095d09464ba18e288a3f529410af0f1257ac2aMike Lockwood
1567188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    struct KeyMap {
1577188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        const char *tag;
1587188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        int key;
1597188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    };
1607188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    static const KeyMap kKeyMap[] = {
1617188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "tracknumber", METADATA_KEY_CD_TRACK_NUMBER },
1627188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "discnumber", METADATA_KEY_DISC_NUMBER },
1637188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "album", METADATA_KEY_ALBUM },
1647188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "artist", METADATA_KEY_ARTIST },
1657188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "albumartist", METADATA_KEY_ALBUMARTIST },
1667188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "composer", METADATA_KEY_COMPOSER },
1677188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "genre", METADATA_KEY_GENRE },
1687188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "title", METADATA_KEY_TITLE },
1697188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "year", METADATA_KEY_YEAR },
1707188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "duration", METADATA_KEY_DURATION },
1717188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "writer", METADATA_KEY_WRITER },
1727188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "compilation", METADATA_KEY_COMPILATION },
1737188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        { "isdrm", METADATA_KEY_IS_DRM },
1747188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    };
1757188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    static const size_t kNumEntries = sizeof(kKeyMap) / sizeof(kKeyMap[0]);
1767188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown
1777188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    for (size_t i = 0; i < kNumEntries; ++i) {
1787188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        const char *value;
1797188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown        if ((value = mRetriever->extractMetadata(kKeyMap[i].key)) != NULL) {
1807188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown            status = client.addStringTag(kKeyMap[i].tag, value);
1817188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown            if (status) {
1827188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown                return MEDIA_SCAN_RESULT_ERROR;
18367e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber            }
18467e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber        }
18567e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber    }
18667e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
1877188e55f54a43c55fd6b96454720c447f1dc454eJeff Brown    return MEDIA_SCAN_RESULT_OK;
18867e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber}
18967e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
19067e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huberchar *StagefrightMediaScanner::extractAlbumArt(int fd) {
1912e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber    LOGV("extractAlbumArt %d", fd);
1922e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber
193c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t size = lseek64(fd, 0, SEEK_END);
194fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    if (size < 0) {
195fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        return NULL;
196fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    }
197c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    lseek64(fd, 0, SEEK_SET);
198fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
1990a095d09464ba18e288a3f529410af0f1257ac2aMike Lockwood    sp<MediaMetadataRetriever> mRetriever(new MediaMetadataRetriever);
2007f7d52ac18dfc3c6d8f6267dad29306613e9bd0eJames Dong    if (mRetriever->setDataSource(fd, 0, size) == OK) {
2012e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber        sp<IMemory> mem = mRetriever->extractAlbumArt();
2022e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber
2032e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber        if (mem != NULL) {
2042e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber            MediaAlbumArt *art = static_cast<MediaAlbumArt *>(mem->pointer());
20567e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
206fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            char *data = (char *)malloc(art->mSize + 4);
207fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            *(int32_t *)data = art->mSize;
2082e39c1ca101e01ff13b03129a87939e7982b25bfAndreas Huber            memcpy(&data[4], &art[1], art->mSize);
209fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
210fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber            return data;
211fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber        }
21267e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber    }
21367e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
21467e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber    return NULL;
21567e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber}
21667e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber
21767e5a4f6f6879d512a859e5dba92e9beec7a2f91Andreas Huber}  // namespace android
218