+static void Ogg_ReadKateHeader( logical_stream_t *p_stream,
+ ogg_packet *p_oggpacket )
+{
+ oggpack_buffer opb;
+ int32_t gnum;
+ int32_t gden;
+ int n;
+
+ p_stream->fmt.i_cat = SPU_ES;
+ p_stream->fmt.i_codec = VLC_FOURCC( 'k','a','t','e' );
+
+ /* Signal that we want to keep a backup of the kate
+ * stream headers. They will be used when switching between
+ * kate streams. */
+ p_stream->b_force_backup = 1;
+
+ /* Cheat and get additionnal info ;) */
+ oggpack_readinit( &opb, p_oggpacket->packet, p_oggpacket->bytes);
+ oggpack_adv( &opb, 11*8 ); /* packet type, kate magic, version */
+ p_stream->i_kate_num_headers = oggpack_read( &opb, 8 );
+ oggpack_adv( &opb, 3*8 );
+ p_stream->i_granule_shift = oggpack_read( &opb, 8 );
+ oggpack_adv( &opb, 8*8 ); /* reserved */
+ gnum = oggpack_read( &opb, 32 );
+ gden = oggpack_read( &opb, 32 );
+ p_stream->f_rate = (double)gnum/gden;
+
+ p_stream->fmt.psz_language = malloc(16);
+ if (p_stream->fmt.psz_language)
+ {
+ for (n=0;n<16;++n)
+ p_stream->fmt.psz_language[n] = oggpack_read(&opb,8);
+ p_stream->fmt.psz_language[15] = 0; /* just in case */
+ }
+ else
+ {
+ for (n=0;n<16;++n)
+ oggpack_read(&opb,8);
+ }
+ p_stream->fmt.psz_description = malloc(16);
+ if (p_stream->fmt.psz_description)
+ {
+ for (n=0;n<16;++n)
+ p_stream->fmt.psz_description[n] = oggpack_read(&opb,8);
+ p_stream->fmt.psz_description[15] = 0; /* just in case */
+ }
+ else
+ {
+ for (n=0;n<16;++n)
+ oggpack_read(&opb,8);
+ }
+}
+