annotate libmpdemux/demux_demuxers.c @ 7974:db1f16543379

enable volume filter and fix nonsense default volume (still not usable because mixer.c has no mechanism to pass volume commands to libaf)
author rfelker
date Wed, 30 Oct 2002 04:11:26 +0000
parents f9d23c2aa6b7
children 324b6e5387be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
1
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
2 #include "config.h"
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
3
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
4 #include <stdlib.h>
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
5 #include <stdio.h>
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
6 #include "stream.h"
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
7 #include "demuxer.h"
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
8 #include "stheader.h"
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
9
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
10 typedef struct dd_priv {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
11 demuxer_t* vd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
12 demuxer_t* ad;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
13 demuxer_t* sd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
14 } dd_priv_t;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
15
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
16
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
17 demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
18 demuxer_t* ret;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
19 dd_priv_t* priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
20
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
21 ret = (demuxer_t*)calloc(1,sizeof(demuxer_t));
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
22
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
23 priv = (dd_priv_t*)malloc(sizeof(dd_priv_t));
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
24 priv->vd = vd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
25 priv->ad = ad;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
26 priv->sd = sd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
27 ret->priv = priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
28
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
29 ret->type = ret->file_format = DEMUXER_TYPE_DEMUXERS;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
30 // Video is the most important :-)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
31 ret->stream = vd->stream;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
32 ret->seekable = vd->seekable && ad->seekable && sd->seekable;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
33
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
34 ret->video = vd->video;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
35 ret->audio = ad->audio;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
36 ret->sub = sd->sub;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
37
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
38 return ret;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
39 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
40
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
41 int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
42 dd_priv_t* priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
43
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
44 priv=demux->priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
45
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
46 if(ds->demuxer == priv->vd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
47 return demux_fill_buffer(priv->vd,ds);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
48 else if(ds->demuxer == priv->ad)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
49 return demux_fill_buffer(priv->ad,ds);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
50 else if(ds->demuxer == priv->sd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
51 return demux_fill_buffer(priv->sd,ds);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
52
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
53 printf("Demux demuxers fill_buffer error : bad demuxer : not vd, ad nor sd\n");
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
54 return 0;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
55 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
56
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
57 void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
58 dd_priv_t* priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
59 float pos;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
60 priv=demuxer->priv;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
61
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
62 priv->ad->stream->eof = 0;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
63 priv->sd->stream->eof = 0;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
64
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
65 // Seek video
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
66 demux_seek(priv->vd,rel_seek_secs,flags);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
67 // Get the new pos
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
68 pos = demuxer->video->pts;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
69
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
70 if(priv->ad != priv->vd) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
71 sh_audio_t* sh = (sh_audio_t*)demuxer->audio->sh;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
72 demux_seek(priv->ad,pos,1);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
73 // In case the demuxer don't set pts
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
74 if(!demuxer->audio->pts)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
75 demuxer->audio->pts = pos-((ds_tell_pts(demuxer->audio)-sh->a_in_buffer_len)/(float)sh->i_bps);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
76 if(sh->timer)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
77 sh->timer = 0;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
78 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
79
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
80 if(priv->sd != priv->vd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
81 demux_seek(priv->sd,pos,1);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
82
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents:
diff changeset
83 }
5812
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
84
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
85 void demux_close_demuxers(demuxer_t* demuxer) {
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
86 int i;
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
87 dd_priv_t* priv = demuxer->priv;
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
88
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
89 if(priv->vd)
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
90 free_demuxer(priv->vd);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
91 if(priv->ad && priv->ad != priv->vd)
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
92 free_demuxer(priv->ad);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
93 if(priv->sd && priv->sd != priv->vd && priv->sd != priv->ad)
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
94 free_demuxer(priv->sd);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
95
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
96 free(priv);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
97 if(demuxer->info) {
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
98 for(i=0;demuxer->info[i] != NULL; i++)
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
99 free(demuxer->info[i]);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
100 free(demuxer->info);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
101 }
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
102 free(demuxer);
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
103 }
f9d23c2aa6b7 Uninit added
albeu
parents: 4765
diff changeset
104