comparison libmpdemux/demux_ogg.c @ 16175:6b86089c2edd

Demuxer modularization Demuxer selection by name with -demuxer command (bakward compatible)
author rtognimp
date Fri, 05 Aug 2005 19:57:47 +0000
parents 79008c38fcd9
children 6ff303d2876b
comparison
equal deleted inserted replaced
16174:b118c000ddd2 16175:6b86089c2edd
732 char *demux_ogg_sub_lang(demuxer_t *demuxer, int index) { 732 char *demux_ogg_sub_lang(demuxer_t *demuxer, int index) {
733 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv; 733 ogg_demuxer_t *ogg_d = (ogg_demuxer_t *)demuxer->priv;
734 return (index < 0) ? NULL : (index >= ogg_d->n_text) ? NULL : ogg_d->text_langs[index]; 734 return (index < 0) ? NULL : (index >= ogg_d->n_text) ? NULL : ogg_d->text_langs[index];
735 } 735 }
736 736
737 void demux_close_ogg(demuxer_t* demuxer); 737 static void demux_close_ogg(demuxer_t* demuxer);
738 738
739 static inline unsigned int store_ughvlc(unsigned char *s, unsigned int v) 739 static inline unsigned int store_ughvlc(unsigned char *s, unsigned int v)
740 { 740 {
741 unsigned int n = 0; 741 unsigned int n = 0;
742 742
817 free(buf[0]); 817 free(buf[0]);
818 } 818 }
819 819
820 820
821 /// Open an ogg physical stream 821 /// Open an ogg physical stream
822 // Not static because it's used also in demuxer_avi.c
822 int demux_ogg_open(demuxer_t* demuxer) { 823 int demux_ogg_open(demuxer_t* demuxer) {
823 ogg_demuxer_t* ogg_d; 824 ogg_demuxer_t* ogg_d;
824 stream_t *s; 825 stream_t *s;
825 char* buf; 826 char* buf;
826 int np,s_no, n_audio = 0, n_video = 0; 827 int np,s_no, n_audio = 0, n_video = 0;
1192 sh_a = demuxer->audio->sh; 1193 sh_a = demuxer->audio->sh;
1193 if(sh_a) 1194 if(sh_a)
1194 if(sh_a->format == FOURCC_VORBIS) 1195 if(sh_a->format == FOURCC_VORBIS)
1195 fixup_vorbis_wf(sh_a); 1196 fixup_vorbis_wf(sh_a);
1196 1197
1197 return 1; 1198 return DEMUXER_TYPE_OGG;
1198 1199
1199 err_out: 1200 err_out:
1200 return 0; 1201 return 0;
1201 } 1202 }
1202 1203
1203 1204
1204 int demux_ogg_fill_buffer(demuxer_t *d) { 1205 static int demux_ogg_fill_buffer(demuxer_t *d, demux_stream_t *dsds) {
1205 ogg_demuxer_t* ogg_d; 1206 ogg_demuxer_t* ogg_d;
1206 stream_t *s; 1207 stream_t *s;
1207 demux_stream_t *ds; 1208 demux_stream_t *ds;
1208 ogg_sync_state* sync; 1209 ogg_sync_state* sync;
1209 ogg_stream_state* os; 1210 ogg_stream_state* os;
1342 // Write the page 1343 // Write the page
1343 ogg_stream_pagein(&ogg_d->subs[0].stream,&ogg_d->page); 1344 ogg_stream_pagein(&ogg_d->subs[0].stream,&ogg_d->page);
1344 1345
1345 // Create the ds_stream and the ogg demuxer 1346 // Create the ds_stream and the ogg demuxer
1346 s = new_ds_stream(demuxer->audio); 1347 s = new_ds_stream(demuxer->audio);
1347 od = new_demuxer(s,DEMUXER_TYPE_OGG,0,-2,-2); 1348 od = new_demuxer(s,DEMUXER_TYPE_OGG,0,-2,-2,NULL);
1348 1349
1349 /// Add the header packets in the ogg demuxer audio stream 1350 /// Add the header packets in the ogg demuxer audio stream
1350 // Initial header 1351 // Initial header
1351 dp = new_demux_packet(hdrsizes[0]); 1352 dp = new_demux_packet(hdrsizes[0]);
1352 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+22+sizeof(WAVEFORMATEX)+3*sizeof(uint32_t),hdrsizes[0]); 1353 memcpy(dp->buffer,((unsigned char*)sh_audio->wf)+22+sizeof(WAVEFORMATEX)+3*sizeof(uint32_t),hdrsizes[0]);
1378 1379
1379 } 1380 }
1380 1381
1381 extern void resync_audio_stream(sh_audio_t *sh_audio); 1382 extern void resync_audio_stream(sh_audio_t *sh_audio);
1382 1383
1383 void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) { 1384 static void demux_ogg_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
1384 ogg_demuxer_t* ogg_d = demuxer->priv; 1385 ogg_demuxer_t* ogg_d = demuxer->priv;
1385 ogg_sync_state* sync = &ogg_d->sync; 1386 ogg_sync_state* sync = &ogg_d->sync;
1386 ogg_page* page= &ogg_d->page; 1387 ogg_page* page= &ogg_d->page;
1387 ogg_stream_state* oss; 1388 ogg_stream_state* oss;
1388 ogg_stream_t* os; 1389 ogg_stream_t* os;
1555 1556
1556 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n"); 1557 mp_msg(MSGT_DEMUX,MSGL_ERR,"Can't find the good packet :(\n");
1557 1558
1558 } 1559 }
1559 1560
1560 void demux_close_ogg(demuxer_t* demuxer) { 1561 static void demux_close_ogg(demuxer_t* demuxer) {
1561 ogg_demuxer_t* ogg_d = demuxer->priv; 1562 ogg_demuxer_t* ogg_d = demuxer->priv;
1562 int i; 1563 int i;
1563 1564
1564 if(!ogg_d) 1565 if(!ogg_d)
1565 return; 1566 return;
1585 free(ogg_d->text_langs); 1586 free(ogg_d->text_langs);
1586 } 1587 }
1587 free(ogg_d); 1588 free(ogg_d);
1588 } 1589 }
1589 1590
1590 int demux_ogg_control(demuxer_t *demuxer,int cmd, void *arg){ 1591 static int demux_ogg_control(demuxer_t *demuxer,int cmd, void *arg){
1591 ogg_demuxer_t* ogg_d = demuxer->priv; 1592 ogg_demuxer_t* ogg_d = demuxer->priv;
1592 ogg_stream_t* os; 1593 ogg_stream_t* os;
1593 float rate; 1594 float rate;
1594 1595
1595 if(demuxer->video->id >= 0) { 1596 if(demuxer->video->id >= 0) {
1615 default: 1616 default:
1616 return DEMUXER_CTRL_NOTIMPL; 1617 return DEMUXER_CTRL_NOTIMPL;
1617 } 1618 }
1618 } 1619 }
1619 1620
1621
1622
1623 demuxer_desc_t demuxer_desc_ogg = {
1624 "Ogg demuxer",
1625 "ogg",
1626 "Ogg",
1627 "?",
1628 "",
1629 DEMUXER_TYPE_OGG,
1630 1, // safe autodetect
1631 demux_ogg_open,
1632 demux_ogg_fill_buffer,
1633 NULL,
1634 demux_close_ogg,
1635 demux_ogg_seek,
1636 demux_ogg_control
1637 };
1638
1620 #endif 1639 #endif