Playing AAC RTP stream using ffdshow

817 views Asked by At

I am trying to play an RTP stream from using a custom network source filter and ffdshow audio decoder (ffdshow-tryout stable). The mediatype that I set on my source output stream is MEDIASUBTYPE_RAW_AAC1. Here is what I am setting:

            pmt->SetType(&MEDIATYPE_Audio);
            pmt->SetSubtype(&MEDIASUBTYPE_RAW_AAC1);
            pmt->SetFormatType(&FORMAT_WaveFormatEx);


            BYTE *AACRAW;
            DWORD dwLen = sizeof(WAVEFORMATEX) + 2; //2 bytes of audio config
            AACRAW = (BYTE *)::CoTaskMemAlloc(dwLen);
            memset(AACRAW, 0, dwLen);


            WAVEFORMATEX wfx;
            wfx.wFormatTag = WAVE_FORMAT_RAW_AAC1;
            wfx.nChannels = 1;
            wfx.nSamplesPerSec = 16000;
            wfx.nAvgBytesPerSec = 8000;
            wfx.nBlockAlign = 1;
            wfx.wBitsPerSample= 0;
            wfx.cbSize = 2;

            memcpy(AACRAW, (void *)&wfx, sizeof(WAVEFORMATEX));

            vector<unsigned char>extra;
            extra.push_back(0x14);
            extra.push_back(0x08);
            memcpy(AACRAW + sizeof(WAVEFORMATEX), extra.data(), extra.size());

            pmt->SetFormat(AACRAW, dwLen);          

            ::CoTaskMemFree(AACRAW);

And then when I receive a rtp packet here is what I forward to the ffdshow filter:

DeliverRTPAAC(pRaw + 12 + 2 + 2, nBufSize - 12 - 2 - 2, pack.timestamp);

where pRaw is the pointer to the rtp packet. Each rtp packet that I receive contains one AU.

The filters connect but does not play audio. No error output from the AAC decoder as well.

The SDP parameters from the Axis camera are:

a=rtpmap:97 mpeg4-generic/16000/1
a=fmtp:97 streamtype=5; profile-level-id=15; mode=AAC-hbr; config=1408; sizeLength=13; indexLength=3; indexDeltaLength=3; profile=1; bitrate=64000; 

Can somebody help me out please?

1

There are 1 answers

1
Geraint Davies On

Probably the data you are receiving is wrapped in ADTS headers and you need to strip the ADTS header to supply the decoder with raw AAC.