# HG changeset patch # User nicodvb # Date 1165524785 0 # Node ID 5924b2b9f5de6c0b26af8709c9dd76685dc7275c # Parent 37b9766b84fbca1a51269454ead4869e689d7ffe made vorbis_info a member of ogg_stream rather than ogg_demuxer; this change paves the way for multi audio track support diff -r 37b9766b84fb -r 5924b2b9f5de libmpdemux/demux_ogg.c --- a/libmpdemux/demux_ogg.c Thu Dec 07 18:10:16 2006 +0000 +++ b/libmpdemux/demux_ogg.c Thu Dec 07 20:53:05 2006 +0000 @@ -109,6 +109,9 @@ int text; int id; + vorbis_info vi; + int vi_inited; + void *ogg_d; } ogg_stream_t; @@ -129,9 +132,6 @@ int n_text; int *text_ids; char **text_langs; - - vorbis_info vi; - int vi_inited; } ogg_demuxer_t; #define NUM_VORBIS_HDR_PACKETS 3 @@ -328,13 +328,13 @@ if(os->vorbis) { if(*pack->packet & PACKET_TYPE_HEADER) os->hdr_packets++; - else if (ogg_d->vi_inited) + else if (os->vi_inited) { vorbis_info *vi; int32_t blocksize; // When we dump the audio, there is no vi, but we don't care of timestamp in this case - vi = &(ogg_d->vi); + vi = &(os->vi); blocksize = vorbis_packet_blocksize(vi,pack) / samplesize; // Calculate the timestamp if the packet don't have any if(pack->granulepos == -1) { @@ -748,9 +748,10 @@ unsigned char *buf[3]; unsigned char *ptr; unsigned int len; + ogg_stream_t *os = &od->subs[sh->ds->id]; vorbis_comment vc; - vorbis_info_init(&od->vi); + vorbis_info_init(&os->vi); vorbis_comment_init(&vc); for(i = 0; i < 3; i++) { op[i].bytes = ds_get_packet(sh->ds, &(op[i].packet)); @@ -765,7 +766,7 @@ memcpy(buf[i], op[i].packet, op[i].bytes); op[i].b_o_s = (i==0); - ris = vorbis_synthesis_headerin(&(od->vi),&vc,&(op[i])); + ris = vorbis_synthesis_headerin(&(os->vi),&vc,&(op[i])); if(ris < 0) { init_error = 1; mp_msg(MSGT_DECAUDIO,MSGL_ERR,"DEMUX_OGG: header n. %d broken! len=%ld, code: %d\n", i, op[i].bytes, ris); @@ -773,7 +774,7 @@ } vorbis_comment_clear(&vc); if(!init_error) - od->vi_inited = 1; + os->vi_inited = 1; len = op[0].bytes + op[1].bytes + op[2].bytes; sh->wf = calloc(1, sizeof(WAVEFORMATEX) + len + len/255 + 64); @@ -1437,7 +1438,7 @@ /* demux_ogg_read_packet needs decoder context for Vorbis streams */ if(((sh_audio_t*)demuxer->audio->sh)->format == FOURCC_VORBIS) context = ((sh_audio_t*)demuxer->audio->sh)->context; - vi = &(ogg_d->vi); + vi = &(os->vi); rate = (float)vi->rate; samplesize = ((sh_audio_t*)ds->sh)->samplesize; } @@ -1585,6 +1586,7 @@ static void demux_close_ogg(demuxer_t* demuxer) { ogg_demuxer_t* ogg_d = demuxer->priv; + ogg_stream_t* os = NULL; int i; if(!ogg_d) @@ -1610,7 +1612,11 @@ if (ogg_d->text_langs[i]) free(ogg_d->text_langs[i]); free(ogg_d->text_langs); } - vorbis_info_clear(&ogg_d->vi); + if(demuxer->audio->id > -1) { + os = &ogg_d->subs[demuxer->audio->id]; + if(os && os->vi_inited) + vorbis_info_clear(&os->vi); + } free(ogg_d); } @@ -1624,7 +1630,7 @@ rate = os->samplerate; } else { os = &ogg_d->subs[demuxer->audio->id]; - rate = ogg_d->vi.rate; + rate = os->vi.rate; }