> Hi Sir,
Please, call me Dude. Not sir. :-)
> Thanks for giving me the right direction..
Sorry for not getting back to you sooner -- the FreeAmp 2.0 release was hell
since our server started going on the fritz.
> I got struck with GetHeadInfo() function.
This function is MP3 specific -- it may not be much use to you. This
function is also a *royal* pain the in butt -- I don't know how many times
I've had to tweak it. No wonder its not obvious what's going on.
> I really dont understand why you are calling
> head_info3() two times. The second time you are filling the
> MPEG Header variable(local), sHead.
>
> MPEG_HEAD sHead;
> int iFrameBytes, iBitRate;
>
> iFrameBytes = head_info3(((unsigned char *)pBuffer) +
> m_frameBytes + iForward + m_sMpegHead.pad,
> iMaxFrameSize - (m_frameBytes + iForward),
> &sHead, &iBitRate, &iForward);
The basic idea behind this function is to seek to the first MP3 frame.
Typically a proper MP3 file will not need this function, but a file that is
corrupted a the beginning or an HTTP stream where you might get tossed into
the middle of a frame requires it.
The difficulty of this function is derived from the fact that MP3 frames
start with 0xFF 0xF*. This marks the start of a frame -- however, MP3 takes
no precautions to not have 0xFF 0xF* appear anywhere else in the bitstream.
So, if the MP3 decoder simply advances the stream to the first 0xFF 0xF* it
may end up in the middle of a frame instead of at the beginning of a frame.
So, when I find a 0xFF 0xF* I call head_info3() to get the stats about that
frame. Then I seek exactly one frame ahead and call head_info3() again to
make sure that the data I got from the first frame matches the second frame.
The sampling rate, MPEG-1 vs MPEG-2 and audio layer need to be same in order
for me to consider these frames valid. (Note: You cannot compare bitrate,
because of VBR streams) If the data does not jive, I assume that I landed in
the middle of an audio frame and seek to the next frame and repeat the
process. If the second frame does match, I go one further and look a the 3rd
frame to make sure it matches as well. If I get the third match, I exit the
function with the input stream positioned at the first valid frame.
> You are not using 'sHead' anywhere. Could you clarify?
You just spotted a bug! The following two lines should be using sHead and
not m_sMpegHead. I will make the necessary changes. Thanks for pointing this
out.
if (m_frameBytes > 0 && m_frameBytes < iMaxFrameSize &&
(m_sMpegHead.option == 1 || m_sMpegHead.option == 2))
--ruaok Freezerburn! All else is only icing. -- Soul Coughing
Robert Kaye -- [EMAIL PROTECTED] http://moon.eorbit.net/~robert
_______________________________________________
[EMAIL PROTECTED]
http://www.freeamp.org/mailman/listinfo/freeamp-dev