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

Commit 5da22937 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Convert AMRExtractor to AMediaFormat

Bug: 111407253
Test: manual
Change-Id: I084d8e3a7b8fcba55c2f0cc777f155b1a6f0e466
parent b4e880ab
Loading
Loading
Loading
Loading
+31 −29
Original line number Diff line number Diff line
@@ -29,11 +29,11 @@

namespace android {

class AMRSource : public MediaTrackHelper {
class AMRSource : public MediaTrackHelperV2 {
public:
    AMRSource(
            DataSourceHelper *source,
            MetaDataBase &meta,
            AMediaFormat *meta,
            bool isWide,
            const off64_t *offset_table,
            size_t offset_table_length);
@@ -41,7 +41,7 @@ public:
    virtual status_t start();
    virtual status_t stop();

    virtual status_t getFormat(MetaDataBase &);
    virtual status_t getFormat(AMediaFormat *);

    virtual status_t read(
            MediaBufferBase **buffer, const ReadOptions *options = NULL);
@@ -51,7 +51,7 @@ protected:

private:
    DataSourceHelper *mDataSource;
    MetaDataBase mMeta;
    AMediaFormat *mMeta;
    bool mIsWide;

    off64_t mOffset;
@@ -151,12 +151,12 @@ AMRExtractor::AMRExtractor(DataSourceHelper *source)
        return;
    }

    mMeta.setCString(
            kKeyMIMEType, mIsWide ? MEDIA_MIMETYPE_AUDIO_AMR_WB
                                  : MEDIA_MIMETYPE_AUDIO_AMR_NB);
    mMeta = AMediaFormat_new();
    AMediaFormat_setString(mMeta, AMEDIAFORMAT_KEY_MIME,
            mIsWide ? MEDIA_MIMETYPE_AUDIO_AMR_WB : MEDIA_MIMETYPE_AUDIO_AMR_NB);

    mMeta.setInt32(kKeyChannelCount, 1);
    mMeta.setInt32(kKeySampleRate, mIsWide ? 16000 : 8000);
    AMediaFormat_setInt32(mMeta, AMEDIAFORMAT_KEY_CHANNEL_COUNT, 1);
    AMediaFormat_setInt32(mMeta, AMEDIAFORMAT_KEY_SAMPLE_RATE, mIsWide ? 16000 : 8000);

    off64_t offset = mIsWide ? 9 : 6;
    off64_t streamSize;
@@ -183,7 +183,7 @@ AMRExtractor::AMRExtractor(DataSourceHelper *source)
            numFrames ++;
        }

        mMeta.setInt64(kKeyDuration, duration);
        AMediaFormat_setInt64(mMeta, AMEDIAFORMAT_KEY_DURATION, duration);
    }

    mInitCheck = OK;
@@ -191,13 +191,15 @@ AMRExtractor::AMRExtractor(DataSourceHelper *source)

AMRExtractor::~AMRExtractor() {
    delete mDataSource;
    AMediaFormat_delete(mMeta);
}

status_t AMRExtractor::getMetaData(MetaDataBase &meta) {
    meta.clear();
status_t AMRExtractor::getMetaData(AMediaFormat *meta) {
    AMediaFormat_clear(meta);

    if (mInitCheck == OK) {
        meta.setCString(kKeyMIMEType, mIsWide ? "audio/amr-wb" : "audio/amr");
        AMediaFormat_setString(meta,
                AMEDIAFORMAT_KEY_MIME, mIsWide ? "audio/amr-wb" : "audio/amr");
    }

    return OK;
@@ -207,7 +209,7 @@ size_t AMRExtractor::countTracks() {
    return mInitCheck == OK ? 1 : 0;
}

MediaTrackHelper *AMRExtractor::getTrack(size_t index) {
MediaTrackHelperV2 *AMRExtractor::getTrack(size_t index) {
    if (mInitCheck != OK || index != 0) {
        return NULL;
    }
@@ -216,19 +218,19 @@ MediaTrackHelper *AMRExtractor::getTrack(size_t index) {
            mOffsetTable, mOffsetTableLength);
}

status_t AMRExtractor::getTrackMetaData(MetaDataBase &meta, size_t index, uint32_t /* flags */) {
status_t AMRExtractor::getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t /* flags */) {
    if (mInitCheck != OK || index != 0) {
        return UNKNOWN_ERROR;
    }

    meta = mMeta;
    AMediaFormat_copy(meta, mMeta);
    return OK;
}

////////////////////////////////////////////////////////////////////////////////

AMRSource::AMRSource(
        DataSourceHelper *source, MetaDataBase &meta,
        DataSourceHelper *source, AMediaFormat *meta,
        bool isWide, const off64_t *offset_table, size_t offset_table_length)
    : mDataSource(source),
      mMeta(meta),
@@ -271,8 +273,8 @@ status_t AMRSource::stop() {
    return OK;
}

status_t AMRSource::getFormat(MetaDataBase &meta) {
    meta = mMeta;
status_t AMRSource::getFormat(AMediaFormat *meta) {
    AMediaFormat_copy(meta, mMeta);
    return OK;
}

@@ -366,22 +368,22 @@ extern "C" {
__attribute__ ((visibility ("default")))
ExtractorDef GETEXTRACTORDEF() {
    return {
        EXTRACTORDEF_VERSION,
        EXTRACTORDEF_VERSION_CURRENT,
        UUID("c86639c9-2f31-40ac-a715-fa01b4493aaf"),
        1,
        "AMR Extractor",
        {
           [](
           .v2 = [](
                    CDataSource *source,
                    float *confidence,
                    void **,
                    FreeMetaFunc *) -> CreatorFunc {
                    FreeMetaFunc *) -> CreatorFuncV2 {
                DataSourceHelper helper(source);
                if (SniffAMR(&helper, nullptr, confidence)) {
                    return [](
                            CDataSource *source,
                            void *) -> CMediaExtractor* {
                        return wrap(new AMRExtractor(new DataSourceHelper(source)));};
                            void *) -> CMediaExtractorV2* {
                        return wrapV2(new AMRExtractor(new DataSourceHelper(source)));};
                }
                return NULL;
            }
+6 −6
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@
#include <utils/Errors.h>
#include <media/MediaExtractorPluginApi.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MetaDataBase.h>
#include <media/NdkMediaFormat.h>

namespace android {

@@ -29,15 +29,15 @@ struct AMessage;
class String8;
#define OFFSET_TABLE_LEN    300

class AMRExtractor : public MediaExtractorPluginHelper {
class AMRExtractor : public MediaExtractorPluginHelperV2 {
public:
    explicit AMRExtractor(DataSourceHelper *source);

    virtual size_t countTracks();
    virtual MediaTrackHelper *getTrack(size_t index);
    virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags);
    virtual MediaTrackHelperV2 *getTrack(size_t index);
    virtual status_t getTrackMetaData(AMediaFormat *meta, size_t index, uint32_t flags);

    virtual status_t getMetaData(MetaDataBase& meta);
    virtual status_t getMetaData(AMediaFormat *meta);
    virtual const char * name() { return "AMRExtractor"; }

protected:
@@ -45,7 +45,7 @@ protected:

private:
    DataSourceHelper *mDataSource;
    MetaDataBase mMeta;
    AMediaFormat *mMeta;
    status_t mInitCheck;
    bool mIsWide;

+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ cc_library_shared {
    shared_libs: [
        "liblog",
        "libmediaextractor",
        "libmediandk",
    ],

    static_libs: [