static int prvPutMediaSendData()

in src/source/app/kvsapp.c [694:765]


static int prvPutMediaSendData(KvsApp_t *pKvs, int *pxSendCnt, bool bForceSend)
{
    int res = ERRNO_NONE;
    DataFrameHandle xDataFrameHandle = NULL;
    DataFrameIn_t *pDataFrameIn = NULL;
    uint8_t *pData = NULL;
    size_t uDataLen = 0;
    uint8_t *pMkvHeader = NULL;
    size_t uMkvHeaderLen = 0;
    int xSendCnt = 0;

    if (pKvs->xStreamHandle != NULL &&
        pKvs->isEbmlHeaderUpdated == true &&
        Kvs_streamAvailOnTrack(pKvs->xStreamHandle, TRACK_VIDEO) &&
        (!bForceSend || !pKvs->isAudioTrackPresent || Kvs_streamAvailOnTrack(pKvs->xStreamHandle, TRACK_AUDIO)))
    {
        if ((xDataFrameHandle = Kvs_streamPop(pKvs->xStreamHandle)) == NULL)
        {
            LogError("Failed to get data frame");
            res = ERRNO_FAIL;
        }
        else if (prvCheckOnDataFrameToBeSent(xDataFrameHandle) != ERRNO_NONE)
        {
            LogInfo("Failed to check OnDataFrameToBeSent");
            /* We don't treat this condition as error because it's a validation error. */
        }
        else if (Kvs_dataFrameGetContent(xDataFrameHandle, &pMkvHeader, &uMkvHeaderLen, &pData, &uDataLen) != 0)
        {
            LogError("Failed to get data and mkv header to send");
            res = ERRNO_FAIL;
        }
        else if (Kvs_putMediaUpdate(pKvs->xPutMediaHandle, pMkvHeader, uMkvHeaderLen, pData, uDataLen) != 0)
        {
            LogError("Failed to update");
            res = ERRNO_FAIL;
        }
        else
        {
            pDataFrameIn = (DataFrameIn_t *)xDataFrameHandle;
            pKvs->uEarliestTimestamp = pDataFrameIn->uTimestampMs;

            xSendCnt++;

            if (pKvs->onMkvSentCallbackInfo.onMkvSentCallback != NULL)
            {
                /* FIXME: Handle the return value in a proper way. */
                pKvs->onMkvSentCallbackInfo.onMkvSentCallback(pMkvHeader, uMkvHeaderLen, pKvs->onMkvSentCallbackInfo.pAppData);

                /* FIXME: Handle the return value in a proper way. */
                pKvs->onMkvSentCallbackInfo.onMkvSentCallback(pData, uDataLen, pKvs->onMkvSentCallbackInfo.pAppData);
            }
        }

        if (xDataFrameHandle != NULL)
        {
            pDataFrameIn = (DataFrameIn_t *)xDataFrameHandle;
            prvCallOnDataFrameTerminate(pDataFrameIn);
            if (pDataFrameIn->pUserData != NULL)
            {
                kvsFree(pDataFrameIn->pUserData);
            }
            Kvs_dataFrameTerminate(xDataFrameHandle);
        }
    }

    if (pxSendCnt != NULL)
    {
        *pxSendCnt = xSendCnt;
    }

    return res;
}