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

Commit 3445de78 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Convert MidiExtractor to use AMediaFormat

Bug: 111407253
Test: manual
Change-Id: I75479a1cbab82a798435134e7211aaab0d0a9421
parent 56f1938e
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -9,6 +9,7 @@ cc_library_shared {
    shared_libs: [
    shared_libs: [
        "liblog",
        "liblog",
        "libmediaextractor",
        "libmediaextractor",
        "libmediandk",
    ],
    ],


    static_libs: [
    static_libs: [
+40 −31
Original line number Original line Diff line number Diff line
@@ -33,16 +33,16 @@ namespace android {
// how many Sonivox output buffers to aggregate into one MediaBufferBase
// how many Sonivox output buffers to aggregate into one MediaBufferBase
static const int NUM_COMBINE_BUFFERS = 4;
static const int NUM_COMBINE_BUFFERS = 4;


class MidiSource : public MediaTrackHelper {
class MidiSource : public MediaTrackHelperV2 {


public:
public:
    MidiSource(
    MidiSource(
            MidiEngine &engine,
            MidiEngine &engine,
            MetaDataBase &trackMetadata);
            AMediaFormat *trackMetadata);


    virtual status_t start(MetaDataBase *params);
    virtual status_t start(AMediaFormat *params);
    virtual status_t stop();
    virtual status_t stop();
    virtual status_t getFormat(MetaDataBase&);
    virtual status_t getFormat(AMediaFormat *);


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


private:
private:
    MidiEngine &mEngine;
    MidiEngine &mEngine;
    MetaDataBase &mTrackMetadata;
    AMediaFormat *mTrackMetadata;
    bool mInitCheck;
    bool mInitCheck;
    bool mStarted;
    bool mStarted;


@@ -69,7 +69,7 @@ private:


MidiSource::MidiSource(
MidiSource::MidiSource(
        MidiEngine &engine,
        MidiEngine &engine,
        MetaDataBase &trackMetadata)
        AMediaFormat *trackMetadata)
    : mEngine(engine),
    : mEngine(engine),
      mTrackMetadata(trackMetadata),
      mTrackMetadata(trackMetadata),
      mInitCheck(false),
      mInitCheck(false),
@@ -87,7 +87,7 @@ MidiSource::~MidiSource()
    }
    }
}
}


status_t MidiSource::start(MetaDataBase * /* params */)
status_t MidiSource::start(AMediaFormat * /* params */)
{
{
    ALOGV("MidiSource::start");
    ALOGV("MidiSource::start");


@@ -108,9 +108,9 @@ status_t MidiSource::stop()
    return OK;
    return OK;
}
}


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


@@ -143,8 +143,8 @@ status_t MidiSource::init()
// MidiEngine
// MidiEngine


MidiEngine::MidiEngine(CDataSource *dataSource,
MidiEngine::MidiEngine(CDataSource *dataSource,
        MetaDataBase *fileMetadata,
        AMediaFormat *fileMetadata,
        MetaDataBase *trackMetadata) :
        AMediaFormat *trackMetadata) :
            mGroup(NULL),
            mGroup(NULL),
            mEasData(NULL),
            mEasData(NULL),
            mEasHandle(NULL),
            mEasHandle(NULL),
@@ -170,16 +170,20 @@ MidiEngine::MidiEngine(CDataSource *dataSource,
    }
    }


    if (fileMetadata != NULL) {
    if (fileMetadata != NULL) {
        fileMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_MIDI);
        AMediaFormat_setString(fileMetadata, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_AUDIO_MIDI);
    }
    }


    if (trackMetadata != NULL) {
    if (trackMetadata != NULL) {
        trackMetadata->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_RAW);
        AMediaFormat_setString(trackMetadata, AMEDIAFORMAT_KEY_MIME, MEDIA_MIMETYPE_AUDIO_RAW);
        trackMetadata->setInt64(kKeyDuration, 1000ll * temp); // milli->micro
        AMediaFormat_setInt64(
                trackMetadata, AMEDIAFORMAT_KEY_DURATION, 1000ll * temp); // milli->micro
        mEasConfig = EAS_Config();
        mEasConfig = EAS_Config();
        trackMetadata->setInt32(kKeySampleRate, mEasConfig->sampleRate);
        AMediaFormat_setInt32(
        trackMetadata->setInt32(kKeyChannelCount, mEasConfig->numChannels);
                trackMetadata, AMEDIAFORMAT_KEY_SAMPLE_RATE, mEasConfig->sampleRate);
        trackMetadata->setInt32(kKeyPcmEncoding, kAudioEncodingPcm16bit);
        AMediaFormat_setInt32(
                trackMetadata, AMEDIAFORMAT_KEY_CHANNEL_COUNT, mEasConfig->numChannels);
        AMediaFormat_setInt32(
                trackMetadata, AMEDIAFORMAT_KEY_PCM_ENCODING, kAudioEncodingPcm16bit);
    }
    }
    mIsInitialized = true;
    mIsInitialized = true;
}
}
@@ -268,13 +272,17 @@ MidiExtractor::MidiExtractor(
      mInitCheck(false)
      mInitCheck(false)
{
{
    ALOGV("MidiExtractor ctor");
    ALOGV("MidiExtractor ctor");
    mEngine = new MidiEngine(mDataSource, &mFileMetadata, &mTrackMetadata);
    mFileMetadata = AMediaFormat_new();
    mTrackMetadata = AMediaFormat_new();
    mEngine = new MidiEngine(mDataSource, mFileMetadata, mTrackMetadata);
    mInitCheck = mEngine->initCheck();
    mInitCheck = mEngine->initCheck();
}
}


MidiExtractor::~MidiExtractor()
MidiExtractor::~MidiExtractor()
{
{
    ALOGV("MidiExtractor dtor");
    ALOGV("MidiExtractor dtor");
    AMediaFormat_delete(mFileMetadata);
    AMediaFormat_delete(mTrackMetadata);
}
}


size_t MidiExtractor::countTracks()
size_t MidiExtractor::countTracks()
@@ -282,7 +290,7 @@ size_t MidiExtractor::countTracks()
    return mInitCheck == OK ? 1 : 0;
    return mInitCheck == OK ? 1 : 0;
}
}


MediaTrackHelper *MidiExtractor::getTrack(size_t index)
MediaTrackHelperV2 *MidiExtractor::getTrack(size_t index)
{
{
    if (mInitCheck != OK || index > 0) {
    if (mInitCheck != OK || index > 0) {
        return NULL;
        return NULL;
@@ -291,20 +299,20 @@ MediaTrackHelper *MidiExtractor::getTrack(size_t index)
}
}


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


status_t MidiExtractor::getMetaData(MetaDataBase &meta)
status_t MidiExtractor::getMetaData(AMediaFormat *meta)
{
{
    ALOGV("MidiExtractor::getMetaData");
    ALOGV("MidiExtractor::getMetaData");
    meta = mFileMetadata;
    AMediaFormat_copy(meta, mFileMetadata);
    return OK;
    return OK;
}
}


@@ -323,26 +331,27 @@ bool SniffMidi(CDataSource *source, float *confidence)


}
}



extern "C" {
extern "C" {
// This is the only symbol that needs to be exported
// This is the only symbol that needs to be exported
__attribute__ ((visibility ("default")))
__attribute__ ((visibility ("default")))
ExtractorDef GETEXTRACTORDEF() {
ExtractorDef GETEXTRACTORDEF() {
    return {
    return {
        EXTRACTORDEF_VERSION,
        EXTRACTORDEF_VERSION_CURRENT,
        UUID("ef6cca0a-f8a2-43e6-ba5f-dfcd7c9a7ef2"),
        UUID("ef6cca0a-f8a2-43e6-ba5f-dfcd7c9a7ef2"),
        1,
        1,
        "MIDI Extractor",
        "MIDI Extractor",
        {
        {
            [](
            .v2 = [](
                CDataSource *source,
                CDataSource *source,
                float *confidence,
                float *confidence,
                void **,
                void **,
                    FreeMetaFunc *) -> CreatorFunc {
                FreeMetaFunc *) -> CreatorFuncV2 {
                if (SniffMidi(source, confidence)) {
                if (SniffMidi(source, confidence)) {
                    return [](
                    return [](
                            CDataSource *source,
                            CDataSource *source,
                            void *) -> CMediaExtractor* {
                            void *) -> CMediaExtractorV2* {
                        return wrap(new MidiExtractor(source));};
                        return wrapV2(new MidiExtractor(source));};
                }
                }
                return NULL;
                return NULL;
            }
            }
+9 −9
Original line number Original line Diff line number Diff line
@@ -22,8 +22,8 @@
#include <media/MediaExtractorPluginHelper.h>
#include <media/MediaExtractorPluginHelper.h>
#include <media/stagefright/MediaBufferBase.h>
#include <media/stagefright/MediaBufferBase.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MediaBufferGroup.h>
#include <media/stagefright/MetaDataBase.h>
#include <media/MidiIoWrapper.h>
#include <media/MidiIoWrapper.h>
#include <media/NdkMediaFormat.h>
#include <utils/String8.h>
#include <utils/String8.h>
#include <libsonivox/eas.h>
#include <libsonivox/eas.h>


@@ -32,8 +32,8 @@ namespace android {
class MidiEngine {
class MidiEngine {
public:
public:
    explicit MidiEngine(CDataSource *dataSource,
    explicit MidiEngine(CDataSource *dataSource,
            MetaDataBase *fileMetadata,
            AMediaFormat *fileMetadata,
            MetaDataBase *trackMetadata);
            AMediaFormat *trackMetadata);
    ~MidiEngine();
    ~MidiEngine();


    status_t initCheck();
    status_t initCheck();
@@ -51,16 +51,16 @@ private:
    bool mIsInitialized;
    bool mIsInitialized;
};
};


class MidiExtractor : public MediaExtractorPluginHelper {
class MidiExtractor : public MediaExtractorPluginHelperV2 {


public:
public:
    explicit MidiExtractor(CDataSource *source);
    explicit MidiExtractor(CDataSource *source);


    virtual size_t countTracks();
    virtual size_t countTracks();
    virtual MediaTrackHelper *getTrack(size_t index);
    virtual MediaTrackHelperV2 *getTrack(size_t index);
    virtual status_t getTrackMetaData(MetaDataBase& meta, size_t index, uint32_t flags);
    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 "MidiExtractor"; }
    virtual const char * name() { return "MidiExtractor"; }


protected:
protected:
@@ -69,10 +69,10 @@ protected:
private:
private:
    CDataSource *mDataSource;
    CDataSource *mDataSource;
    status_t mInitCheck;
    status_t mInitCheck;
    MetaDataBase mFileMetadata;
    AMediaFormat *mFileMetadata;


    // There is only one track
    // There is only one track
    MetaDataBase mTrackMetadata;
    AMediaFormat *mTrackMetadata;


    MidiEngine *mEngine;
    MidiEngine *mEngine;