[Vorbis-dev] re: want to know, how much data will be extracted from every single packet; solved but some issues

Tertium Organum tertium at front.ru
Tue Jan 10 17:57:29 PST 2006


ok, ok, i've found the solution to my problem.
if anybody dont mind, i 'll tell, what i have achieve :)
 
let's see logical vorbis stream (actually i have no stream, coz i have rid of ogg).
first three packets - identification, comments and codebooks. then goes a packet, which, as i understood, is just auxiliary for the next one. In addition, it holds (it can be found via vorbis_packet_blocksize) size of pcm data, that the next one holds. In general every packet holds part of size of pcm data in next packet, i.e.:


     	cur = vorbis_packet_blocksize(&m_vorb_info, &m_packets[cur_packet_num]);
      	if ( cur <= 0 )  
        m_packets_real_lengths[cur_packet_num] = 0;
      	else
      	{
        if (prev == 0 )
        	prev = cur;
      	if (cur_packet_num > 3 && cur_packet_num < m_packets_number - 1)
      	{
        	m_packets_real_lengths[cur_packet_num] = cur + prev;
        	m_data_size += m_packets_real_lengths[cur_packet_num];
      	}
      	else
        	m_packets_real_lengths[cur_packet_num] = 0;
        prev = cur;
    }

But not so easy. We must begin loop where cur_packet_num > 3 and cur_packet_num < m_packets_number - 1, because:
- first (aux) after 3 info packets (so it's  index will be 3) always has size of pcm data of 0
- last packet (it's index well be m_packets_number - 1) - size of pcm data in most cases its impossible to get this way accuratly - because of the how vorbis handles little packets u will get greater value than actually is.

so, first 4 (if include 3 info packets, as i did) pcm sizes in vector m_packets_real_lengths are zeros.
in order to get the last value correctly for the last packet we must unpack some last packets. As i read different mail lists i found metion about the fact that for unpacking packet X one need unpack packet X - 1 befor. 
I honestly tried do this, but in fact works properly only this code:

for (uint32 i = m_packets_number - 6; i < m_packets_number; i++)
{
  if (vorbis_synthesis(&vorb_block,&m_packets[i])==0) 
  	vorbis_synthesis_blockin(&vorb_dsp_state,&vorb_block);
  int bout = vorbis_synthesis_pcmout(&vorb_dsp_state,NULL);
  if (i == m_packets_number - 1)
  {
  	m_packets_real_lengths[i]  = 2 * m_vorb_info.channels * bout;
  	m_data_size += m_packets_real_lengths[i];
  }
  vorbis_synthesis_read(&vorb_dsp_state,bout); 
}

exactly  m_packets_number - 6 and no more :) i 'm lost in conjectures, why is this so... but it works.
hah, strange thing, but in code that unpack later fragments of stream into pcm buffer i consider that for packet X i must have only X-1 and code works too...


PLEASE SOMEBODY TELL ME WHY I MUST UNPACK 5 (!!!) PACKETS BEFORE I CAN PROPERLY UNPACK THE LAST PACKET AND GET THE ACTUAL SIZE OF PCM DATA IT HOLDS???




More information about the Vorbis-dev mailing list