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

Commit e0076754 authored by Mingming Yin's avatar Mingming Yin Committed by Linux Build Service Account
Browse files

NuPlayer: audio playback enhancement for NuPlayer

- Add playback support for EVRC, QCELP, AMRWB+,
  and WMA formats in NuPlayer...

Change-Id: I2beacb0d3081b9e83410fee3a8400fc6150af0ce
parent c7a16a41
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -107,6 +107,9 @@ struct ExtendedCodec {
            AString* componentName, AString* mime,
            int32_t isEncoder);

    static void overrideMimeType(
        const sp<AMessage> &msg, AString* mime);

    static void getRawCodecSpecificData(
            const sp<MetaData> &meta,
            const void* &data,
+3 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/ExtendedCodec.h>


namespace android {

@@ -105,6 +107,7 @@ void NuPlayer::Decoder::onConfigure(const sp<AMessage> &format) {
    mComponentName.append(" decoder");
    ALOGV("[%s] onConfigure (surface=%p)", mComponentName.c_str(), surface.get());

    ExtendedCodec::overrideMimeType(format, &mime);
    mCodec = MediaCodec::CreateByType(mCodecLooper, mime.c_str(), false /* encoder */);
    int32_t secure = 0;
    if (format->findInt32("secure", &secure) && secure != 0) {
+1 −1
Original line number Diff line number Diff line
@@ -3599,7 +3599,7 @@ status_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> &notify) {
                                      &mimeType,
                                      mOMX,
                                      mNode,
                                      kPortIndexOutput,
                                      portIndex,
                                      &channelCount,
                                      &sampleRate);
                        notify->setString("mime", mimeType.c_str());
+65 −1
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@
#include <OMX_VideoExt.h>
#include <OMX_IndexExt.h>
#include <QOMX_AudioExtensions.h>
#include <QOMX_AudioIndexExtensions.h>
#include "include/ExtendedUtils.h"

namespace android {
@@ -250,6 +251,26 @@ void ExtendedCodec::overrideComponentName(
    }
}

void ExtendedCodec::overrideMimeType(
        const sp<AMessage> &msg, AString* mime) {

    if (!strncmp(mime->c_str(), MEDIA_MIMETYPE_AUDIO_WMA,
         strlen(MEDIA_MIMETYPE_AUDIO_WMA))) {
        int32_t WMAVersion = 0;
        if ((msg->findInt32(getMsgKey(kKeyWMAVersion), &WMAVersion))) {
            if (WMAVersion==kTypeWMA) {
                //no need to update mime type
            } else if (WMAVersion==kTypeWMAPro) {
                mime->setTo("audio/x-ms-wma-pro");
            } else if (WMAVersion==kTypeWMALossLess) {
                mime->setTo("audio/x-ms-wma-lossless");
            } else {
                ALOGE("could not set valid wma mime type");
            }
        }
    }
}

template<class T>
static void InitOMXParams(T *params) {
    params->nSize = sizeof(T);
@@ -494,6 +515,39 @@ status_t ExtendedCodec::getSupportedAudioFormatInfo(
        *channelCount = params.nChannels;
        /* EVRC supports only 8k sample rate*/
        *sampleRate = 8000;
    } else if (!strncmp(mime->c_str(), MEDIA_MIMETYPE_AUDIO_AMR_WB_PLUS, strlen(MEDIA_MIMETYPE_AUDIO_AMR_WB_PLUS))) {
        OMX_INDEXTYPE index;
        QOMX_AUDIO_PARAM_AMRWBPLUSTYPE params;

        InitOMXParams(&params);
        params.nPortIndex = portIndex;
        OMXhandle->getExtensionIndex(nodeID, OMX_QCOM_INDEX_PARAM_AMRWBPLUS, &index);
        CHECK_EQ(OMXhandle->getParameter(nodeID, index, &params, sizeof(params)),(status_t)OK);
        *channelCount = params.nChannels;
        *sampleRate = params.nSampleRate;
    } else if (!strncmp(mime->c_str(), MEDIA_MIMETYPE_AUDIO_WMA, strlen(MEDIA_MIMETYPE_AUDIO_WMA))) {
        status_t err = OK;
        OMX_INDEXTYPE index;
        OMX_AUDIO_PARAM_WMATYPE paramWMA;
        QOMX_AUDIO_PARAM_WMA10PROTYPE paramWMA10;

        InitOMXParams(&paramWMA);
        paramWMA.nPortIndex = portIndex;
        err = OMXhandle->getParameter(
                   nodeID, OMX_IndexParamAudioWma, &paramWMA, sizeof(paramWMA));
        if(err == OK) {
            ALOGV("WMA format");
            *channelCount = paramWMA.nChannels;
            *sampleRate = paramWMA.nSamplingRate;
        } else {
            InitOMXParams(&paramWMA10);
            paramWMA10.nPortIndex = portIndex;
            OMXhandle->getExtensionIndex(nodeID,"OMX.Qualcomm.index.audio.wma10Pro",&index);
            CHECK_EQ(OMXhandle->getParameter(nodeID, index, &paramWMA10, sizeof(paramWMA10)),(status_t)OK);
            ALOGV("WMA10 format");
            *channelCount = paramWMA10.nChannels;
            *sampleRate = paramWMA10.nSamplingRate;
        }
    } else {
        retVal = BAD_VALUE;
    }
@@ -501,12 +555,16 @@ status_t ExtendedCodec::getSupportedAudioFormatInfo(
}

status_t ExtendedCodec::handleSupportedAudioFormats(int format, AString* mime) {
    ALOGV("checkQCFormats called");
    ALOGV("handleSupportedAudioFormats called for format:%x",format);
    status_t retVal = OK;
    if (format == OMX_AUDIO_CodingQCELP13 ) {
        *mime = MEDIA_MIMETYPE_AUDIO_QCELP;
    } else if (format == OMX_AUDIO_CodingEVRC ) {
        *mime = MEDIA_MIMETYPE_AUDIO_EVRC;
    } else if (format == OMX_AUDIO_CodingWMA ) {
        *mime = MEDIA_MIMETYPE_AUDIO_WMA;
    } else if (format == QOMX_IndexParamAudioAmrWbPlus ) {
        *mime = MEDIA_MIMETYPE_AUDIO_AMR_WB_PLUS;
    } else {
        retVal = BAD_VALUE;
    }
@@ -1247,6 +1305,12 @@ namespace android {
        ARG_TOUCH(isEncoder);
    }

    void ExtendedCodec::overrideMimeType(
        const sp<AMessage> &msg, AString* mime) {
        ARG_TOUCH(msg);
        ARG_TOUCH(mime);
    }

    void ExtendedCodec::getRawCodecSpecificData(
        const sp<MetaData> &meta, const void* &data, size_t &size) {
        ARG_TOUCH(meta);