Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ee43a4e0 authored by Sergii Doroshenko's avatar Sergii Doroshenko Committed by Steve Kondik
Browse files

AACExtractor: Added support for APE tag



To support aac audio with APE tag we need parse
this tag. Otherwise AACExtractor stops reading of
audio file.

DR: OMAPS00267689

Change-Id: Ic697b90dbc9f2b93aeb227411359c36c113cb71e
Signed-off-by: default avatarDaniel Levin <dendy@ti.com>
parent f1993e08
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -136,7 +136,8 @@ AACExtractor::AACExtractor(
        const sp<DataSource> &source, const sp<AMessage> &_meta)
    : mDataSource(source),
      mInitCheck(NO_INIT),
      mFrameDurationUs(0) {
      mFrameDurationUs(0),
      mApeMeta(new MetaData) {
    sp<AMessage> meta = _meta;

    if (meta == NULL) {
@@ -170,9 +171,23 @@ AACExtractor::AACExtractor(
    off64_t streamSize, numFrames = 0;
    size_t frameSize = 0;
    int64_t duration = 0;
    uint8_t apeTag[8];

    if (mDataSource->getSize(&streamSize) == OK) {
         while (offset < streamSize) {
            mDataSource->readAt(offset, &apeTag, 8);
            if (ape.isAPE(apeTag)) {
                size_t apeSize = 0;
                mDataSource->readAt(offset + 8 + 4, &apeSize, 1);

                if (ape.parceAPE(source, offset, &apeSize, mApeMeta) == false) {
                    break;
                }

                mOffsetVector.push(offset);
                offset += apeSize;
                continue;
            }
            if ((frameSize = getAdtsFrameLength(source, offset, NULL)) == 0) {
                break;
            }
@@ -196,15 +211,13 @@ AACExtractor::~AACExtractor() {
}

sp<MetaData> AACExtractor::getMetaData() {
    sp<MetaData> meta = new MetaData;

    if (mInitCheck != OK) {
        return meta;
        return mApeMeta;
    }
    mApeMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC_ADTS);

    meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_AAC_ADTS);

    return meta;
    return mApeMeta;
}

size_t AACExtractor::countTracks() {
+125 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) Texas Instruments - http://www.ti.com/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "APE_TAG"
#include <utils/Log.h>

#include "include/APE.h"

namespace android {

APE::APE(){

}

APE::~APE(){

}

bool APE::isAPE(uint8_t *apeTag) const {
    if(apeTag[0] == 'A' && apeTag[1] == 'P' && apeTag[2] == 'E' &&
        apeTag[3] == 'T' && apeTag[4] == 'A' && apeTag[5] == 'G' &&
        apeTag[6] == 'E' && apeTag[7] == 'X'){
        return true;
    }
    return false;
}

size_t sizeItemKey(const sp<DataSource> &source, off64_t offset){
    off64_t ItemKeyOffset = offset;
    uint8_t keyTerminator;
    size_t keySize = 0;
    while (keyTerminator != 0){
        source->readAt(ItemKeyOffset, &keyTerminator, 1);
        ItemKeyOffset++;
        keySize++;
    }
    return keySize - 1;
}

bool APE::parceAPE(const sp<DataSource> &source, off64_t offset,
        size_t* headerSize, sp<MetaData> &meta){

    struct Map {
            int key;
            const char *tag;
    } const kMap[] = {
            { kKeyAlbum, "Album" },
            { kKeyArtist, "Artist" },
            { kKeyAlbumArtist, "Album" },
            { kKeyComposer, "Composer" },
            { kKeyGenre, "Genre" },
            { kKeyTitle, "Title" },
            { kKeyYear, "Year" },
            { kKeyCDTrackNumber, "Track" },
            { kKeyDate, "Record Date"},
    };

    static const size_t kNumMapEntries = sizeof(kMap) / sizeof(kMap[0]);

    off64_t headerOffset = offset;
    headerOffset += 16;
    itemNumber = 0;
    if (source->readAt(headerOffset, &itemNumber, 1) == 0)
        return false;

    headerOffset += 16;

    for(uint32_t it = 0; it < itemNumber; it++){
        lenValue = 0;
        if (source->readAt(headerOffset, &lenValue, 1) == 0)
            return false;

        headerOffset += 4;

        itemFlags = 0;
        if (source->readAt(headerOffset, &itemFlags, 1) == 0)
            return false;

        headerOffset += 4;

        size_t sizeKey = sizeItemKey(source, headerOffset);

        char *key = new char[sizeKey];

        if (source->readAt(headerOffset, key, sizeKey) == 0)
            return false;

        key[sizeKey] = '\0';
        headerOffset += sizeKey + 1;

        char *val = new char[lenValue + 1];

        if (source->readAt(headerOffset, val, lenValue) == 0)
            return false;

        val[lenValue] = '\0';

        for (size_t i = 0; i < kNumMapEntries; i++){
            if (!strcmp(key, kMap[i].tag)){
                if (itemFlags == 0)
                    meta->setCString(kMap[i].key, (const char *)val);
                break;
            }
        }
        headerOffset += lenValue;
        delete[] key;
        delete[] val;
    }

    return true;
}
} //namespace android
+1 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ LOCAL_SRC_FILES:= \
        ExtendedExtractor.cpp             \
        ExtendedUtils.cpp                 \
        ExtendedStats.cpp                 \
        APE.cpp                           \

LOCAL_C_INCLUDES:= \
        $(TOP)/frameworks/av/include/media/ \
+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <media/stagefright/MediaExtractor.h>

#include <utils/Vector.h>
#include "include/APE.h"

namespace android {

@@ -43,6 +44,8 @@ protected:
private:
    sp<DataSource> mDataSource;
    sp<MetaData> mMeta;
    APE ape;
    sp<MetaData> mApeMeta;
    status_t mInitCheck;

    Vector<uint64_t> mOffsetVector;
+43 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) Texas Instruments - http://www.ti.com/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef APE_TAG_H_

#define APE_TAG_H_

#include <utils/RefBase.h>
#include <media/stagefright/DataSource.h>
#include <media/stagefright/MetaData.h>

namespace android {

class APE{
public:
    APE();
    ~APE();
    bool isAPE(uint8_t *apeTag) const;
    bool parceAPE(const sp<DataSource> &source, off64_t offset,
            size_t* headerSize, sp<MetaData> &meta);

private:
    uint32_t itemNumber;
    uint32_t itemFlags;
    size_t lenValue;
};

} //namespace android

#endif //APE_TAG_H_