khronosfws/openmax_al/src/gst_adaptation/xagstcapabilitiesmgr.c
author hgs
Tue, 21 Sep 2010 11:38:43 -0500
changeset 53 eabc8c503852
parent 33 5e8b14bae8c3
permissions -rw-r--r--
201037

/*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - initial contribution.
 *
 * Contributors:
 *
 * Description: GST Capabilities Mgr. Here you can query the capabilities
 *               of various GST components and store it in a list.
 *
 */

#include <stdio.h>
#include <string.h>
#include <strings.h>

#include "xagstcapabilitiesmgr.h"
#include "xaframeworkmgr.h"

static XAresult XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities(
        XACapabilities **ppNode);
static XAresult XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities(
        XACapabilities **ppNode);
static XAresult XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities(
        XACapabilities **ppNode);

/* XAresult XAGSTCapabilitiesMgr_UpdateCapabilitieList(
 *       FrameworkMap *frameworkMap, XACapabilities **ppListHead)
 * Description: Append capabilities supported by Gstreamer framework.
 */
XAresult XAGSTCapabilitiesMgr_UpdateCapabilitieList(
        FrameworkMap *frameworkMap, XACapabilities **ppListHead)

    {
    XAresult res = XA_RESULT_SUCCESS;
    XACapabilities *newNode = NULL;
    FWMgrFwType fwtype = FWMgrFWUknown;
    char *uri = NULL;
    XACapabilities *lastNode = NULL;
    XACapabilities *firstNode = NULL;

    DEBUG_API("->XAGSTCapabilitiesMgr_UpdateCapabilitieList");

    if (!frameworkMap || !ppListHead)
        {
        DEBUG_ERR("XA_RESULT_PARAMETER_INVALID");
        DEBUG_API("<-XAGSTCapabilitiesMgr_UpdateCapabilitieList");
        return XA_RESULT_PARAMETER_INVALID;
        }

    uri = "file:///c:/test.mp4";
    fwtype = XAFrameworkMgr_GetFramework(frameworkMap, uri, FWMgrMORecorder);
    if (fwtype == FWMgrFWGST)
        {
        res = XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities(&newNode);
        if (res != XA_RESULT_SUCCESS)
            {
            XACapabilitiesMgr_DeleteCapabilitieList(&firstNode);
            DEBUG_API("<-XAGSTCapabilitiesMgr_UpdateCapabilitieList");
            return res;
            }
        if (!firstNode)
            {
            firstNode = newNode;
            lastNode = newNode;
            }
        }

    uri = "file:///c:/test.amr";
    fwtype = XAFrameworkMgr_GetFramework(frameworkMap, uri, FWMgrMORecorder);
    if (fwtype == FWMgrFWGST)
        {
        res = XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities(&newNode);
        if (res != XA_RESULT_SUCCESS)
            {
            XACapabilitiesMgr_DeleteCapabilitieList(&firstNode);
            DEBUG_API("<-XAGSTCapabilitiesMgr_UpdateCapabilitieList");
            return res;
            }
        if (!firstNode)
            {
            firstNode = newNode;
            lastNode = newNode;
            }
        else
            {
            lastNode->next = newNode;
            lastNode = newNode;
            }
        }

    uri = "file:///c:/test.wav";
    fwtype = XAFrameworkMgr_GetFramework(frameworkMap, uri, FWMgrMORecorder);
    if (fwtype == FWMgrFWGST)
        {
        res = XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities(&newNode);
        if (res != XA_RESULT_SUCCESS)
            {
            XACapabilitiesMgr_DeleteCapabilitieList(&firstNode);
            DEBUG_API("<-XAGSTCapabilitiesMgr_UpdateCapabilitieList");
            return res;
            }
        if (!firstNode)
            {
            firstNode = newNode;
            lastNode = newNode;
            }
        else
            {
            lastNode->next = newNode;
            lastNode = newNode;
            }
        }

    /* if we have some capabilities supported by Gstreamer framework */
    if (firstNode)
        {
        /* if empty list, then append first node as the head */
        if (!(*ppListHead))
            {
            *ppListHead = firstNode;
            }
        else /* traverse to the last item in the list and link firstNode to it */
            {
            lastNode = *ppListHead;
            while(lastNode->next)
                {
                lastNode = lastNode->next;
                }
            lastNode->next = firstNode;
            }
        }
    DEBUG_API("<-XAGSTCapabilitiesMgr_UpdateCapabilitieList");
    return res;
    }

/* XAresult XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities(
        XACapabilities **ppNode)
 * Description: If return value is XA_RESULT_SUCCESS, Creats a new XACapabilities
 * node and update ppNode to contain pointer to it.
 * Otherwise return error code for failure.
 */
XAresult XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities(
        XACapabilities **ppNode)
    {
    XAresult res = XA_RESULT_SUCCESS;
    XACapabilities *newNode = NULL;
    XAchar aacencelement[] = "nokiaaacenc";
    int strLen = 0;
    XAAudioCodecDescriptor *codecDesc = NULL;

    DEBUG_API("->XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
    newNode = (XACapabilities *) calloc(1, sizeof(XACapabilities));
    if (!newNode)
        {
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }

    newNode->capsType = AUD_E;
    newNode->xaid = XA_AUDIOCODEC_AAC;

    strLen = strlen((char*) aacencelement);
    newNode->adaptId = (XAchar *) calloc(strLen + 1, sizeof(XAchar));
    if (!newNode->adaptId)
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }

    strncpy((char*) newNode->adaptId, (char*) aacencelement, strLen);
    newNode->adaptId[strLen] = '\0'; /*Null terminate it*/

    /* create XAAudioCodecDescriptor for AAC and initialize values */
    codecDesc = (XAAudioCodecDescriptor*) calloc(2, sizeof(XAAudioCodecDescriptor));
    if (!codecDesc)
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    newNode->noOfEntries = 2;
    newNode->pEntry = (void *)codecDesc;

    codecDesc->maxChannels = 2;
    (codecDesc+1)->maxChannels = 2;
    codecDesc->minBitsPerSample = 16;
    (codecDesc+1)->minBitsPerSample = 16;
    codecDesc->maxBitsPerSample = 16;
    (codecDesc+1)->maxBitsPerSample = 16;
    codecDesc->minSampleRate = 8000000;
    (codecDesc+1)->minSampleRate = 8000000;
    codecDesc->maxSampleRate = 48000000;
    (codecDesc+1)->maxSampleRate = 48000000;
    codecDesc->isFreqRangeContinuous = XA_BOOLEAN_FALSE;
    (codecDesc+1)->isFreqRangeContinuous = XA_BOOLEAN_FALSE;
    codecDesc->pSampleRatesSupported = (XAmilliHertz*)calloc(5, sizeof(XAmilliHertz));
    if (!(codecDesc->pSampleRatesSupported))
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    (codecDesc+1)->pSampleRatesSupported = (XAmilliHertz*)calloc(5, sizeof(XAmilliHertz));
    if (!((codecDesc+1)->pSampleRatesSupported))
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    codecDesc->pSampleRatesSupported[0] = 8000000;
    (codecDesc+1)->pSampleRatesSupported[0] = 8000000;
    codecDesc->pSampleRatesSupported[1] = 16000000;
    (codecDesc+1)->pSampleRatesSupported[1] = 16000000;
    codecDesc->pSampleRatesSupported[2] = 24000000;
    (codecDesc+1)->pSampleRatesSupported[2] = 24000000;
    codecDesc->pSampleRatesSupported[3] = 32000000;
    (codecDesc+1)->pSampleRatesSupported[3] = 32000000;
    codecDesc->pSampleRatesSupported[4] = 48000000;
    (codecDesc+1)->pSampleRatesSupported[4] = 48000000;
    codecDesc->numSampleRatesSupported = 5;
    (codecDesc+1)->numSampleRatesSupported = 5;
    codecDesc->minBitRate = 32000;
    (codecDesc+1)->minBitRate = 32000;
    codecDesc->maxBitRate = 256000;
    (codecDesc+1)->maxBitRate = 256000;
    codecDesc->isBitrateRangeContinuous = XA_BOOLEAN_FALSE;
    (codecDesc+1)->isBitrateRangeContinuous = XA_BOOLEAN_FALSE;
    codecDesc->pBitratesSupported = (XAuint32 *)calloc(8, sizeof(XAuint32));;
    if (!(codecDesc->pBitratesSupported))
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    (codecDesc+1)->pBitratesSupported = (XAuint32 *)calloc(8, sizeof(XAuint32));;
    if (!((codecDesc+1)->pBitratesSupported))
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    codecDesc->pBitratesSupported[0] = 32000;
    (codecDesc+1)->pBitratesSupported[0] = 32000;
    codecDesc->pBitratesSupported[1] = 64000;
    (codecDesc+1)->pBitratesSupported[1] = 64000;
    codecDesc->pBitratesSupported[2] = 96000;
    (codecDesc+1)->pBitratesSupported[2] = 96000;
    codecDesc->pBitratesSupported[3] = 128000;
    (codecDesc+1)->pBitratesSupported[3] = 128000;
    codecDesc->pBitratesSupported[4] = 160000;
    (codecDesc+1)->pBitratesSupported[4] = 160000;
    codecDesc->pBitratesSupported[5] = 192000;
    (codecDesc+1)->pBitratesSupported[5] = 192000;
    codecDesc->pBitratesSupported[6] = 224000;
    (codecDesc+1)->pBitratesSupported[6] = 224000;
    codecDesc->pBitratesSupported[7] = 256000;
    (codecDesc+1)->pBitratesSupported[7] = 256000;
    codecDesc->numBitratesSupported = 8;    
    (codecDesc+1)->numBitratesSupported = 8;    
    codecDesc->profileSetting = XA_AUDIOPROFILE_AAC_AAC;
    (codecDesc+1)->profileSetting = XA_AUDIOPROFILE_AAC_AAC;
    codecDesc->modeSetting = XA_AUDIOMODE_AAC_HE;
    (codecDesc+1)->modeSetting = XA_AUDIOMODE_AAC_LC;

    *ppNode = newNode;

    DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAACEncoderCapabilities");
    return res;
    }

XAresult XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities(
        XACapabilities **ppNode)
    {
    XAresult res = XA_RESULT_SUCCESS;
    XACapabilities *newNode = NULL;
    XAchar amrencelement[] = "devsoundsrc";
    int strLen = 0;
    XAAudioCodecDescriptor *codecDesc = NULL;

    DEBUG_API("->XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities");
    newNode = (XACapabilities *) calloc(1, sizeof(XACapabilities));
    if (!newNode)
        {
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }

    newNode->capsType = AUD_E;
    newNode->xaid = XA_AUDIOCODEC_AMR;
    
    strLen = strlen((char*) amrencelement);
    newNode->adaptId = (XAchar *) calloc(strLen + 1, sizeof(XAchar));
    if (!newNode->adaptId)
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }

    strncpy((char*) newNode->adaptId, (char*) amrencelement, strLen);
    newNode->adaptId[strLen] = '\0'; /*Null terminate it*/
    
    /* create XAAudioCodecDescriptor for AMR and initialize values */
    codecDesc = (XAAudioCodecDescriptor*) calloc(1, sizeof(XAAudioCodecDescriptor));
    if (!codecDesc)
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    newNode->noOfEntries = 1;
    newNode->pEntry = (void *)codecDesc;

    codecDesc->maxChannels = 1;
    codecDesc->minBitsPerSample = 8;
    codecDesc->maxBitsPerSample = 8;
    codecDesc->minSampleRate = 8000000;
    codecDesc->maxSampleRate = 8000000;
    codecDesc->isFreqRangeContinuous = XA_BOOLEAN_FALSE;
    codecDesc->pSampleRatesSupported = (XAmilliHertz*)calloc(1, sizeof(XAmilliHertz));
    if (!(codecDesc->pSampleRatesSupported))
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    codecDesc->pSampleRatesSupported[0] = 8000000;
    codecDesc->numSampleRatesSupported = 1;
    codecDesc->minBitRate = 4750;
    codecDesc->maxBitRate = 12200;
    codecDesc->isBitrateRangeContinuous = XA_BOOLEAN_FALSE;
    codecDesc->pBitratesSupported = (XAuint32 *)calloc(8, sizeof(XAuint32));;
    if (!(codecDesc->pBitratesSupported))
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    codecDesc->pBitratesSupported[0] = 4750;
    codecDesc->pBitratesSupported[1] = 5150;
    codecDesc->pBitratesSupported[2] = 5900;
    codecDesc->pBitratesSupported[3] = 6700;
    codecDesc->pBitratesSupported[4] = 7400;
    codecDesc->pBitratesSupported[5] = 7950;
    codecDesc->pBitratesSupported[6] = 10200;
    codecDesc->pBitratesSupported[7] = 12200;    
    codecDesc->numBitratesSupported = 8;
    codecDesc->profileSetting = XA_AUDIOPROFILE_AMR;
    codecDesc->modeSetting = 0;
    
    *ppNode = newNode;

    DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioAMREncoderCapabilities");
    return res;
    }

XAresult XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities(
        XACapabilities **ppNode)
    {
    XAresult res = XA_RESULT_SUCCESS;
    XACapabilities *newNode = NULL;
    XAchar wavencelement[] = "wavenc";
    int strLen = 0;
    XAAudioCodecDescriptor *codecDesc = NULL;

    DEBUG_API("->XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities");
    newNode = (XACapabilities *) calloc(1, sizeof(XACapabilities));
    if (!newNode)
        {
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }

    newNode->capsType = AUD_E;
    newNode->xaid = XA_AUDIOCODEC_PCM;
    
    strLen = strlen((char*) wavencelement);
    newNode->adaptId = (XAchar *) calloc(strLen + 1, sizeof(XAchar));
    if (!newNode->adaptId)
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }

    strncpy((char*) newNode->adaptId, (char*) wavencelement, strLen);
    newNode->adaptId[strLen] = '\0'; /*Null terminate it*/

    /* create XAAudioCodecDescriptor for PCM and initialize values */
    codecDesc = (XAAudioCodecDescriptor*) calloc(1, sizeof(XAAudioCodecDescriptor));
    if (!codecDesc)
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    newNode->noOfEntries = 1;
    newNode->pEntry = (void *)codecDesc;

    codecDesc->maxChannels = 2;
    codecDesc->minBitsPerSample = 16;
    codecDesc->maxBitsPerSample = 16;
    codecDesc->minSampleRate = 8000000;
    codecDesc->maxSampleRate = 48000000;
    codecDesc->isFreqRangeContinuous = XA_BOOLEAN_FALSE;
    codecDesc->pSampleRatesSupported = (XAmilliHertz*)calloc(12, sizeof(XAmilliHertz));
    if (!(codecDesc->pSampleRatesSupported))
        {
        XACapabilitiesMgr_DeleteCapabilitieList(&newNode);
        DEBUG_ERR("XA_RESULT_MEMORY_FAILURE");
        DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities");
        return XA_RESULT_MEMORY_FAILURE;
        }
    codecDesc->pSampleRatesSupported[0] = 8000000;
    codecDesc->pSampleRatesSupported[1] = 16000000;
    codecDesc->pSampleRatesSupported[2] = 24000000;
    codecDesc->pSampleRatesSupported[3] = 32000000;
    codecDesc->pSampleRatesSupported[4] = 48000000;
    codecDesc->numSampleRatesSupported = 5;
    codecDesc->minBitRate = 0;
    codecDesc->maxBitRate = 0;
    codecDesc->isBitrateRangeContinuous = XA_BOOLEAN_FALSE;
    codecDesc->pBitratesSupported = NULL;
    codecDesc->numBitratesSupported = 0;
    codecDesc->profileSetting = XA_AUDIOPROFILE_PCM;
    codecDesc->modeSetting = 0;
    
    *ppNode = newNode;

    DEBUG_API("<-XAGSTCapabilitiesMgr_GetAudioPCMEncoderCapabilities");
    return res;
    }