On Apr 24, 2013, at 5:32 PM, Paul B Mahol <[email protected]> wrote:

> On 4/25/13, Brad O'Hearne <[email protected]> wrote:
>> Here is the information on the sample buffer received from QTKit which is
>> being used to fill the source data array:
>> 
>> 2013-04-24 17:06:58.653 QTFFmpeg[2732:d407] Linear PCM, 32 bit little-endian
>> floating point, 2 channels, 44100 Hz
>> 2013-04-24 17:06:58.654 QTFFmpeg[2732:d407] Bytes per frame:  4
>> 2013-04-24 17:06:58.654 QTFFmpeg[2732:d407] Frames per packet:  1
>> 2013-04-24 17:06:58.655 QTFFmpeg[2732:d407] Bits per channel: 32
>> 2013-04-24 17:06:58.655 QTFFmpeg[2732:d407] Is packed? YES
>> 2013-04-24 17:06:58.655 QTFFmpeg[2732:d407] Is high aligned? NO
>> 2013-04-24 17:06:58.656 QTFFmpeg[2732:d407] Channels per frame: 2
>> 
>> So to answer your question, provided that I've understood it correctly,
>> samples are packed, therefore should be aligned on the full 32-bit boundary,
> 
> Its byte and not bit.

Actually I meant bit. 1 frame, 4 bytes per frame (4 * 8 bits = 32 bits), 32 
bits per channel, packed, so no offset alignment within that 32-bit (4 byte) 
slot. I presumed that was what you meant by 0 or 1 byte boundary. If not, let 
me know. 

> Another thing, you overwrite sourceData[x] pointers, causing memory leak.

Good catch...I'm aware of a few missing memory frees, as I've profiled it using 
Instruments. As I've been repeatedly trying various things and adding code here 
and there to try to fix this issue, I resolved not to worry about that stuff 
until the thing actually worked. But yes, you are correct. 

There is one thing I probably should clarify. In past posts, you may have heard 
me state that my source sample format was AV_SAMPLE_FMT_FLTP. This might have 
created confusion with my mention above of the captured sample buffer having a 
format of the following: 

>> 2013-04-24 17:06:58.653 QTFFmpeg[2732:d407] Linear PCM, 32 bit little-endian
>> floating point, 2 channels, 44100 Hz

The "Linear PCM" part might have lead you to believe I didn't have a planar 
format. In QTKit, the QTSampleBuffer object has a reference to the data buffer 
which indeed follows this format. However, it also maintains a reference to an 
AudioBufferList which is defined as: 

struct AudioBufferList {
   UInt32      mNumberBuffers;
   AudioBuffer mBuffers[1];
};
typedef struct AudioBufferList AudioBufferList;

This struct allows you to access each buffer contained within the sample, where 
each mBuffer contains a separate channel's data buffer, i.e. each plane of 
data. So if you've looked at my source code, you may notice this block of code: 

                // assign source data
                AudioBufferList *tempAudioBufferList = [sampleBuffer 
audioBufferListWithOptions:0];
                
                for (uint i = 0; i < tempAudioBufferList->mNumberBuffers; i++)
                {
                    sourceData[i] = tempAudioBufferList->mBuffers[i].mData;
                }

That is essentially assigning sourceData with each channel's data plane. I know 
that this works, because when resampling from AV_SAMPLE_FMT_FLTP to 
AV_SAMPLE_FMT_S16 with the ADPCM_SWF codec, I get perfect audio. (Though 
interestingly this first go-round  I never could get the pointer to the linear 
buffer to work -- changing to this planar format and using the channel data 
references from the AudioBufferList is what fixed my previous resampling 
problem). 

So I just wanted to mention that, so that when you saw the "Linear PCM" 
mentioned, it didn't seem as if the wrong source sample format was being used. 
It isn't ... 

Brad


_______________________________________________
Libav-user mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/libav-user

Reply via email to