Commit c0bf68fb authored by Lauros Pajunen's avatar Lauros Pajunen
Browse files

Fix Q-bit parsing, add good frame indication, remove unused evs payload parsing functions

parent a2e78779
Loading
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -2895,7 +2895,8 @@ static ivas_error printBitstreamInfoVoip(
#ifdef IVAS_RTPDUMP
    bool evsIvasModeBit;
    uint16_t bitrateIndex;
    bool ivasIndicatorOrQBit;
    bool ivasIndicatorBit;
    bool isGoodFrame;
#else
    bool isAMRWB_IOmode;
    uint16_t frameTypeIndex;
@@ -2944,7 +2945,7 @@ static ivas_error printBitstreamInfoVoip(
        {
            error = BS_Reader_ReadVoipFrame_compact( hBsReader, au, &auSizeBits, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms );
#ifdef IVAS_RTPDUMP
            ivasIndicatorOrQBit = 1; /* good q_bit for INPUT_FORMAT_G192 */
            isGoodFrame = 1; /* good frame for INPUT_FORMAT_G192 */
#else
            qBit = 1; /* good q_bit for INPUT_FORMAT_G192 */
#endif
@@ -2953,7 +2954,7 @@ static ivas_error printBitstreamInfoVoip(
        {
            auPtr = au; /* might have been set to RTP packet in prev call */
#ifdef IVAS_RTPDUMP
            rtpdumpDepackerError = IVAS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &evsIvasModeBit, &bitrateIndex, &ivasIndicatorOrQBit, &auPtr, (uint16_t *) &auSizeBits );
            rtpdumpDepackerError = IVAS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &evsIvasModeBit, &bitrateIndex, &ivasIndicatorBit, &isGoodFrame, &auPtr, (uint16_t *) &auSizeBits );
#else
            rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &isAMRWB_IOmode, &frameTypeIndex, &qBit, &auPtr, (uint16_t *) &auSizeBits );
#endif
@@ -2967,7 +2968,7 @@ static ivas_error printBitstreamInfoVoip(
            goto cleanup;
        }
#ifdef IVAS_RTPDUMP
    } while ( !ivasIndicatorOrQBit || auSizeBits < MIN_NUM_BITS_ACTIVE_FRAME || auSizeBits == NUM_BITS_SID_IVAS_5K2 );
    } while ( !isGoodFrame || auSizeBits < MIN_NUM_BITS_ACTIVE_FRAME || auSizeBits == NUM_BITS_SID_IVAS_5K2 );
#else
    } while ( !qBit || auSizeBits < MIN_NUM_BITS_ACTIVE_FRAME || auSizeBits == NUM_BITS_SID_IVAS_5K2 );
#endif
@@ -3066,7 +3067,8 @@ static ivas_error decodeVoIP(
#ifdef IVAS_RTPDUMP
    bool evsIvasModeBit;
    uint16_t bitrateIndex;
    bool ivasIndicatorOrQBit;
    bool ivasIndicatorBit;
    bool isGoodFrame;
#else
    bool isAMRWB_IOmode;
    uint16_t frameTypeIndex;
@@ -3177,7 +3179,7 @@ static ivas_error decodeVoIP(
    {
        error = BS_Reader_ReadVoipFrame_compact( hBsReader, au, &auSize, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms );
#ifdef IVAS_RTPDUMP
        ivasIndicatorOrQBit = 1; /* good q_bit for INPUT_FORMAT_G192 */
        isGoodFrame = 1; /* good frame for INPUT_FORMAT_G192 */
#else
        qBit = 1; /* good q_bit for INPUT_FORMAT_G192 */
#endif
@@ -3186,7 +3188,7 @@ static ivas_error decodeVoIP(
    {
        auPtr = au; /* might have been set to RTP packet in prev call */
#ifdef IVAS_RTPDUMP
        rtpdumpDepackerError = IVAS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &evsIvasModeBit, &bitrateIndex, &ivasIndicatorOrQBit, &auPtr, (uint16_t *) &auSize );
        rtpdumpDepackerError = IVAS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &evsIvasModeBit, &bitrateIndex, &ivasIndicatorBit, &isGoodFrame, &auPtr, (uint16_t *) &auSize );
#else
        rtpdumpDepackerError = EVS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms, &isAMRWB_IOmode, &frameTypeIndex, &qBit, &auPtr, (uint16_t *) &auSize );
#endif
@@ -3351,7 +3353,7 @@ static ivas_error decodeVoIP(
        {
            /* feed the previous read packet into the receiver now */
#ifdef IVAS_RTPDUMP
            error = IVAS_DEC_VoIP_FeedFrame( hIvasDec, auPtr, auSize, rtpSequenceNumber, rtpTimeStamp, nextPacketRcvTime_ms, ivasIndicatorOrQBit );
            error = IVAS_DEC_VoIP_FeedFrame( hIvasDec, auPtr, auSize, rtpSequenceNumber, rtpTimeStamp, nextPacketRcvTime_ms, isGoodFrame );
#else
            error = IVAS_DEC_VoIP_FeedFrame( hIvasDec, auPtr, auSize, rtpSequenceNumber, rtpTimeStamp, nextPacketRcvTime_ms, qBit );
#endif
@@ -3368,7 +3370,7 @@ static ivas_error decodeVoIP(
                error = BS_Reader_ReadVoipFrame_compact( hBsReader, au, &auSize, &rtpSequenceNumber, &rtpTimeStamp, &nextPacketRcvTime_ms );

#ifdef IVAS_RTPDUMP
                ivasIndicatorOrQBit = 1; /* good q_bit for VOIP_G192_RTP */
                isGoodFrame = 1; /* good frame for VOIP_G192_RTP */
#else
                qBit = 1; /* good q_bit for VOIP_G192_RTP */
#endif
@@ -3379,8 +3381,8 @@ static ivas_error decodeVoIP(
#ifdef IVAS_RTPDUMP
                rtpdumpDepackerError = IVAS_RTPDUMP_DEPACKER_readNextFrame( &rtpdumpDepacker, &rtpSequenceNumber, &rtpTimeStamp,
                                                                            &nextPacketRcvTime_ms,
                                                                            &evsIvasModeBit, &bitrateIndex, &ivasIndicatorOrQBit,
                                                                            &auPtr, (uint16_t *) &auSize );
                                                                            &evsIvasModeBit, &bitrateIndex, &ivasIndicatorBit,
                                                                            &isGoodFrame, &auPtr, (uint16_t *) &auSize );
                /* IVAS RTP payload format has timescale 16000, JBM uses 1000 internally */
                rtpTimeStamp = rtpTimeStamp / 16;

+5 −0
Original line number Diff line number Diff line
@@ -63,8 +63,13 @@ struct JB4_DATAUNIT
    uint32_t rcvTime;
    /** true, if the data unit contains only silence */
    bool silenceIndicator;
#ifdef IVAS_RTPDUMP
    /** good frame indicator (Q bit for AMR-WB IO, otherwise set to true) */
    Word16 isGoodFrame;
#else
    /** Q bit for AMR-WB IO */
    Word16 qBit;
#endif

    /** the binary encoded access unit */
    uint8_t *data;
+12 −0
Original line number Diff line number Diff line
@@ -3232,7 +3232,11 @@ ivas_error IVAS_DEC_VoIP_FeedFrame(
    const uint16_t rtpSequenceNumber, /* i  : RTP sequence number (16 bits)                   */
    const uint32_t rtpTimeStamp,      /* i  : RTP timestamp (32 bits)                         */
    const uint32_t rcvTime_ms,        /* i  : receive time of the RTP packet in milliseconds  */
#ifdef IVAS_RTPDUMP
    const bool isGoodFrame            /* i  : Good frame indicator (Q bit for AMR-WB IO, otherwise set to true) */
#else
    const bool qBit                   /* i  : Q bit for AMR-WB IO                             */
#endif
)
{
    JB4_DATAUNIT_HANDLE dataUnit;
@@ -3274,7 +3278,11 @@ ivas_error IVAS_DEC_VoIP_FeedFrame(
    dataUnit->timeStamp = rtpTimeStamp;
    dataUnit->partial_frame = 0;
    dataUnit->partialCopyOffset = partialCopyOffset;
#ifdef IVAS_RTPDUMP
    dataUnit->isGoodFrame = isGoodFrame;
#else
    dataUnit->qBit = qBit;
#endif

    /* add the frame to the JBM */
    result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms );
@@ -3297,7 +3305,11 @@ ivas_error IVAS_DEC_VoIP_FeedFrame(
        dataUnit->timeStamp = rtpTimeStamp - partialCopyOffset * dataUnit->duration;
        dataUnit->partial_frame = 1;
        dataUnit->partialCopyOffset = partialCopyOffset;
#ifdef IVAS_RTPDUMP
        dataUnit->isGoodFrame = isGoodFrame;
#else
        dataUnit->qBit = qBit;
#endif

        /* add the frame to the JBM */
        result = JB4_PushDataUnit( hIvasDec->hVoIP->hJBM, dataUnit, rcvTime_ms );
+5 −1
Original line number Diff line number Diff line
@@ -285,7 +285,11 @@ ivas_error IVAS_DEC_VoIP_FeedFrame(
    const uint16_t rtpSequenceNumber,           /* i  : RTP sequence number (16 bits)                                           */
    const uint32_t rtpTimeStamp,                /* i  : RTP timestamp (32 bits)                                                 */
    const uint32_t rcvTime_ms,                  /* i  : receive time of the RTP packet in milliseconds                          */
#ifdef IVAS_RTPDUMP
    const bool isGoodFrame                      /* i  : Good frame indicator (Q bit for AMR-WB IO, otherwise set to true)       */
#else
const bool qBit                             /* i  : Q bit for AMR-WB IO                                                     */
#endif
);

ivas_error IVAS_DEC_VoIP_SetScale(
+24 −3
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@
#include "evs_rtp_payload.h"
#include "options.h"

#ifndef IVAS_RTPDUMP
static void evsPayload_unpackFrame_compact_amrWbIo( const char *payload, uint16_t payloadSizeBits, uint16_t iProtectedSize, unsigned char **framePtr, uint16_t *frameSizeInBits )
{
    uint16_t i, iBit0;
@@ -123,12 +124,30 @@ bool evsPayload_unpackFrame( bool hf_only, char *payload, uint16_t payloadSizeBy
    return evsHeaderFullPayload_unpackFrame( payload, payloadSizeBytes, frameIndex, isAMRWB_IOmode,
                                             frameFollowing, frameTypeIndex, qBit, framePtr, frameSizeInBits );
}
#endif

#ifdef IVAS_RTPDUMP
void evsHeaderFullPayload_parseToc( uint8_t toc, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, int32_t *bitrate )
void evsHeaderFullPayload_parseToc( uint8_t toc, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, bool *isGoodFrame, int32_t *bitrate )
{
    bool evsModeBit = ( toc & 0x20 ) != 0;
    *isAMRWB_IOmode = evsModeBit;
    *frameFollowing = ( toc & 0x40 ) != 0;
    *frameTypeIndex = toc & 0x0f;
    if ( *isAMRWB_IOmode )
    {
        *qBit = ( toc & 0x10 ) != 0;
        *isGoodFrame = *qBit;
        *bitrate = AMRWB_IOmode2rate[*frameTypeIndex];
    }
    else
    {
        *qBit = false; /* Q-bit is unused in EVS Primary mode */
        *isGoodFrame = true; /* assume good frame for EVS Primary */
        *bitrate = PRIMARYmode2rate[*frameTypeIndex];
    }
}
#else
static void evsHeaderFullPayload_parseToc( uint8_t toc, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, int32_t *bitrate )
#endif
{
    bool evsModeBit = ( toc & 0x20 ) != 0;
    *isAMRWB_IOmode = evsModeBit;
@@ -145,8 +164,9 @@ static void evsHeaderFullPayload_parseToc( uint8_t toc, bool *isAMRWB_IOmode, bo
        *bitrate = AMRWB_IOmode2rate[*frameTypeIndex];
    }
}
#endif


#ifndef IVAS_RTPDUMP
bool evsHeaderFullPayload_unpackFrame( char *payload, uint16_t payloadSizeBytes, uint16_t frameIndex, bool *isAMRWB_IOmode, bool *frameFollowing, uint16_t *frameTypeIndex, bool *qBit, unsigned char **frame, uint16_t *frameSizeInBits )
{
    bool someIsAMRWB_IOmode, someFrameFollowing = true, someQBit;
@@ -278,3 +298,4 @@ void EVS_RTPDUMP_DEPACKER_close( EVS_RTPDUMP_DEPACKER *self )
    }
    RTPDUMP_Close( &self->rtpdump, 0 );
}
#endif
Loading