annotate libmpdemux/demuxer.c @ 23510:a6c619ee9d30

Teletext support for tv:// (v4l and v4l2 only) modified patch from Otvos Attila oattila at chello dot hu Module uses zvbi library for all low-level VBI operations (like I/O with vbi device, converting vbi pages into usefull vbi_page stuctures, rendering them into RGB32 images). All teletext related stuff (except properties, slave commands and rendering osd in text mode or RGB32 rendered teletext pages in spu mode) is implemented in tvi_vbi.c New properties: teletext_page - switching between pages teletext_mode - switch between on/off/opaque/transparent modes teletext_format - (currently read-only) allows to get format info (black/white,gray,text) teletext_half_page - trivial zooming (displaying top/bottom half of teletext page) New slave commands: teletext_add_dec - user interface for jumping to any page by editing page number interactively teletext_go_link - goes though links, specified on current page
author voroshil
date Sun, 10 Jun 2007 00:06:12 +0000
parents a124f3abc1ec
children ba9e664dbbaa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 //=================== DEMUXER v2.5 =========================
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
3 #include <stdio.h>
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
4 #include <stdlib.h>
3150
8dae87740d33 bad malloc+strcpy => strdup
arpi
parents: 3101
diff changeset
5 #include <string.h>
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
6 #include <unistd.h>
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1428
diff changeset
7
1428
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1421
diff changeset
8 #include <sys/types.h>
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1421
diff changeset
9 #include <sys/stat.h>
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1421
diff changeset
10
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
11 #include "config.h"
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
12 #include "mp_msg.h"
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
13 #include "help_mp.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16925
diff changeset
14 #include "m_config.h"
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
15
17200
a1b8eeffdfcd include fastmemcpy.h before stream.h, so it is used for the stream_read
reimar
parents: 17012
diff changeset
16 #include "libvo/fastmemcpy.h"
a1b8eeffdfcd include fastmemcpy.h before stream.h, so it is used for the stream_read
reimar
parents: 17012
diff changeset
17
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22488
diff changeset
18 #include "stream/stream.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
19 #include "demuxer.h"
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
20 #include "stheader.h"
4551
716b00618bfc add mfi support
pontscho
parents: 4451
diff changeset
21 #include "mf.h"
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
22
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16925
diff changeset
23 #include "libaf/af_format.h"
5084
2fd327bf64fc added get_sh_video/audio and realmedia seeking
alex
parents: 5068
diff changeset
24
22142
84f95595f31f Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents: 21809
diff changeset
25 extern void resync_video_stream(sh_video_t *sh_video);
16877
9081ae3a702c move resync_audio_stream after seeking to demuxer.c
reimar
parents: 16572
diff changeset
26 extern void resync_audio_stream(sh_audio_t *sh_audio);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
27
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
28 // Demuxer list
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
29 extern demuxer_desc_t demuxer_desc_rawaudio;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
30 extern demuxer_desc_t demuxer_desc_rawvideo;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
31 extern demuxer_desc_t demuxer_desc_tv;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
32 extern demuxer_desc_t demuxer_desc_mf;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
33 extern demuxer_desc_t demuxer_desc_avi;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
34 extern demuxer_desc_t demuxer_desc_y4m;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
35 extern demuxer_desc_t demuxer_desc_asf;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
36 extern demuxer_desc_t demuxer_desc_nuv;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
37 extern demuxer_desc_t demuxer_desc_real;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
38 extern demuxer_desc_t demuxer_desc_smjpeg;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
39 extern demuxer_desc_t demuxer_desc_matroska;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
40 extern demuxer_desc_t demuxer_desc_realaudio;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
41 extern demuxer_desc_t demuxer_desc_vqf;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
42 extern demuxer_desc_t demuxer_desc_mov;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
43 extern demuxer_desc_t demuxer_desc_vivo;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
44 extern demuxer_desc_t demuxer_desc_fli;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
45 extern demuxer_desc_t demuxer_desc_film;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
46 extern demuxer_desc_t demuxer_desc_roq;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
47 extern demuxer_desc_t demuxer_desc_gif;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
48 extern demuxer_desc_t demuxer_desc_ogg;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
49 extern demuxer_desc_t demuxer_desc_avs;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
50 extern demuxer_desc_t demuxer_desc_pva;
18128
a1006db4fe43 fixes decoding demoscene.tv nsv at http://213.186.36.129:8000
gpoirier
parents: 17932
diff changeset
51 extern demuxer_desc_t demuxer_desc_nsv;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
52 extern demuxer_desc_t demuxer_desc_mpeg_ts;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
53 extern demuxer_desc_t demuxer_desc_lmlm4;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
54 extern demuxer_desc_t demuxer_desc_mpeg_ps;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
55 extern demuxer_desc_t demuxer_desc_mpeg_pes;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
56 extern demuxer_desc_t demuxer_desc_mpeg_es;
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16291
diff changeset
57 extern demuxer_desc_t demuxer_desc_mpeg_gxf;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
58 extern demuxer_desc_t demuxer_desc_mpeg4_es;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
59 extern demuxer_desc_t demuxer_desc_h264_es;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
60 extern demuxer_desc_t demuxer_desc_rawdv;
16412
b86be98019b1 Forgotten mpc demuxer
reimar
parents: 16346
diff changeset
61 extern demuxer_desc_t demuxer_desc_mpc;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
62 extern demuxer_desc_t demuxer_desc_audio;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
63 extern demuxer_desc_t demuxer_desc_xmms;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
64 extern demuxer_desc_t demuxer_desc_mpeg_ty;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
65 extern demuxer_desc_t demuxer_desc_rtp;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
66 extern demuxer_desc_t demuxer_desc_lavf;
22971
a1b2fbb000fc Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents: 22605
diff changeset
67 extern demuxer_desc_t demuxer_desc_lavf_preferred;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
68 extern demuxer_desc_t demuxer_desc_aac;
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents: 19540
diff changeset
69 extern demuxer_desc_t demuxer_desc_nut;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
70
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
71 demuxer_desc_t* demuxer_list[] = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
72 &demuxer_desc_rawaudio,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
73 &demuxer_desc_rawvideo,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
74 #ifdef USE_TV
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
75 &demuxer_desc_tv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
76 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
77 &demuxer_desc_mf,
23121
a257dd426da5 Simplify preprocessor directives: There is a general variable for
diego
parents: 23072
diff changeset
78 #ifdef USE_LIBAVFORMAT
22971
a1b2fbb000fc Add lavf_preferred demuxer for lavf formats we want to be probed
reimar
parents: 22605
diff changeset
79 &demuxer_desc_lavf_preferred,
23069
93948eb0280f demuxer_desc_lavf_preferred depends on USE_LIBAVFORMAT or USE_LIBAVFORMAT_SO
nicodvb
parents: 22971
diff changeset
80 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
81 &demuxer_desc_avi,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
82 &demuxer_desc_y4m,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
83 &demuxer_desc_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
84 &demuxer_desc_nsv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
85 &demuxer_desc_nuv,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
86 &demuxer_desc_real,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
87 &demuxer_desc_smjpeg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
88 &demuxer_desc_matroska,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
89 &demuxer_desc_realaudio,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
90 &demuxer_desc_vqf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
91 &demuxer_desc_mov,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
92 &demuxer_desc_vivo,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
93 &demuxer_desc_fli,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
94 &demuxer_desc_film,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
95 &demuxer_desc_roq,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
96 #ifdef HAVE_GIF
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
97 &demuxer_desc_gif,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
98 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
99 #ifdef HAVE_OGGVORBIS
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
100 &demuxer_desc_ogg,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
101 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
102 #ifdef USE_WIN32DLL
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
103 &demuxer_desc_avs,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
104 #endif
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
105 &demuxer_desc_pva,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
106 &demuxer_desc_mpeg_ts,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
107 &demuxer_desc_lmlm4,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
108 &demuxer_desc_mpeg_ps,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
109 &demuxer_desc_mpeg_pes,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
110 &demuxer_desc_mpeg_es,
16310
fb95057e370e support MPEG in GXF container with extension-based detection.
reimar
parents: 16291
diff changeset
111 &demuxer_desc_mpeg_gxf,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
112 &demuxer_desc_mpeg4_es,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
113 &demuxer_desc_h264_es,
21767
ff8dbfde335e don't compile demux_mpc.c when libmpcdec is disabled
aurel
parents: 20948
diff changeset
114 #ifdef MUSEPACK
16412
b86be98019b1 Forgotten mpc demuxer
reimar
parents: 16346
diff changeset
115 &demuxer_desc_mpc,
21767
ff8dbfde335e don't compile demux_mpc.c when libmpcdec is disabled
aurel
parents: 20948
diff changeset
116 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
117 &demuxer_desc_audio,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
118 &demuxer_desc_mpeg_ty,
16572
56a5f69e9b35 "LIVE.COM Streaming Media" is now called "LIVE555 Streaming Media".
rsf
parents: 16522
diff changeset
119 #ifdef STREAMING_LIVE555
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
120 &demuxer_desc_rtp,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
121 #endif
23121
a257dd426da5 Simplify preprocessor directives: There is a general variable for
diego
parents: 23072
diff changeset
122 #ifdef USE_LIBAVFORMAT
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
123 &demuxer_desc_lavf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
124 #endif
18900
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
125 #ifdef HAVE_LIBDV095
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
126 &demuxer_desc_rawdv,
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
127 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
128 &demuxer_desc_aac,
19861
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents: 19540
diff changeset
129 #ifdef HAVE_LIBNUT
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents: 19540
diff changeset
130 &demuxer_desc_nut,
b251bca5820c Add demux_nut to MPlayer repo
ods15
parents: 19540
diff changeset
131 #endif
18900
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
132 #ifdef HAVE_XMMS
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
133 &demuxer_desc_xmms,
0b53e6d1b27f move some ill-behaving demuxers further down the list
reimar
parents: 18708
diff changeset
134 #endif
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
135 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
136 };
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
137
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
138 void free_demuxer_stream(demux_stream_t *ds){
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
139 ds_free_packs(ds);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
140 free(ds);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
141 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
142
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 demux_stream_t* ds=malloc(sizeof(demux_stream_t));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 ds->buffer_pos=ds->buffer_size=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146 ds->buffer=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 ds->pts=0;
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
148 ds->pts_bytes=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 ds->eof=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 ds->pos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 ds->dpos=0;
889
1b905517c684 AVI -bps desync problem solved
arpi_esp
parents: 828
diff changeset
152 ds->pack_no=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 //---------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 ds->packs=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 ds->bytes=0;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
156 ds->first=ds->last=ds->current=NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 ds->id=id;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
158 ds->demuxer=demuxer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 //----------------
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 ds->asf_seq=-1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 ds->asf_packet=NULL;
291
da98e96499bb sh_audio/sh_video added, general codec cleanup
arpi_esp
parents: 1
diff changeset
162 //----------------
7754
0568245deeb8 ss_div/ss_mul defaults to 0
arpi
parents: 7594
diff changeset
163 ds->ss_mul=ds->ss_div=0;
2419
24ba3dfb8e89 compressed mov audio fixed
arpi
parents: 2338
diff changeset
164 //----------------
291
da98e96499bb sh_audio/sh_video added, general codec cleanup
arpi_esp
parents: 1
diff changeset
165 ds->sh=NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 return ds;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
169
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
170 /**
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
171 * Get demuxer description structure for a given demuxer type
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
172 *
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
173 * @param file_format type of the demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
174 * @return structure for the demuxer, NULL if not found
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
175 */
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
176 static demuxer_desc_t* get_demuxer_desc_from_type(int file_format)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
177 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
178 int i;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
179
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
180 for (i = 0; demuxer_list[i]; i++)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
181 if (file_format == demuxer_list[i]->type)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
182 return demuxer_list[i];
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
183
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
184 return NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
185 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
186
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
187
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
188 demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char *filename){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 demuxer_t *d=malloc(sizeof(demuxer_t));
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
190 memset(d,0,sizeof(demuxer_t));
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 d->stream=stream;
21780
c9795699c414 added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents: 21767
diff changeset
192 d->stream_pts = MP_NOPTS_VALUE;
598
c7117e17e20b OSD seekbar fixed for mpeg/VCD
arpi_esp
parents: 587
diff changeset
193 d->movi_start=stream->start_pos;
c7117e17e20b OSD seekbar fixed for mpeg/VCD
arpi_esp
parents: 587
diff changeset
194 d->movi_end=stream->end_pos;
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
195 d->seekable=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196 d->synced=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
197 d->filepos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
198 d->audio=new_demuxer_stream(d,a_id);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 d->video=new_demuxer_stream(d,v_id);
552
c2a449f90087 dvd sub support reading
arpi_esp
parents: 291
diff changeset
200 d->sub=new_demuxer_stream(d,s_id);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 d->type=type;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
202 if(type)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
203 if (!(d->desc = get_demuxer_desc_from_type(type)))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
204 mp_msg(MSGT_DEMUXER,MSGL_ERR,"BUG! Invalid demuxer type in new_demuxer(), big troubles ahead.");
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
205 if(filename) // Filename hack for avs_check_file
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
206 d->filename=strdup(filename);
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
207 stream_reset(stream);
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
208 stream_seek(stream,stream->start_pos);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 return d;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211
20872
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
212 sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) {
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
213 if (id > MAX_S_STREAMS - 1 || id < 0) {
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
214 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested sub stream id overflow (%d > %d)\n",
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
215 id, MAX_S_STREAMS);
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
216 return NULL;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
217 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
218 if (demuxer->s_streams[id])
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
219 mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id);
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
220 else {
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
221 sh_sub_t *sh = calloc(1, sizeof(sh_sub_t));
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
222 demuxer->s_streams[id] = sh;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
223 sh->sid = sid;
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
224 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid);
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
225 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
226 return demuxer->s_streams[id];
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
227 }
a8b42366e68a Make subtitle stream handling more similar to audio and video streams.
reimar
parents: 20851
diff changeset
228
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
229 sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){
5084
2fd327bf64fc added get_sh_video/audio and realmedia seeking
alex
parents: 5068
diff changeset
230 if(id > MAX_A_STREAMS-1 || id < 0)
4642
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
231 {
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
232 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested audio stream id overflow (%d > %d)\n",
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
233 id, MAX_A_STREAMS);
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
234 return NULL;
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
235 }
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
236 if(demuxer->a_streams[id]){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
237 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_AudioStreamRedefined,id);
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
238 } else {
13357
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
239 sh_audio_t *sh;
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
240 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id);
20072
3f63d6e12a1a Simplify: replace malloc + memset 0 by calloc
reimar
parents: 19862
diff changeset
241 demuxer->a_streams[id]=calloc(1, sizeof(sh_audio_t));
13357
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
242 sh = demuxer->a_streams[id];
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
243 // set some defaults
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
244 sh->samplesize=2;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14197
diff changeset
245 sh->sample_format=AF_FORMAT_S16_NE;
13357
c605df89ca9f moved sh_audio initialization from dec_audio to demuxer.c to fix
reimar
parents: 13301
diff changeset
246 sh->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
247 sh->pts=MP_NOPTS_VALUE;
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
248 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid);
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
249 }
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
250 ((sh_audio_t *)demuxer->a_streams[id])->aid = aid;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
251 return demuxer->a_streams[id];
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
252 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
253
18708
9e2b300db17b Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents: 18404
diff changeset
254 void free_sh_audio(demuxer_t *demuxer, int id) {
9e2b300db17b Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents: 18404
diff changeset
255 sh_audio_t *sh = demuxer->a_streams[id];
9e2b300db17b Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents: 18404
diff changeset
256 demuxer->a_streams[id] = NULL;
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
257 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
258 if(sh->wf) free(sh->wf);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
259 free(sh);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
260 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
261
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
262 sh_video_t* new_sh_video_vid(demuxer_t *demuxer,int id,int vid){
5084
2fd327bf64fc added get_sh_video/audio and realmedia seeking
alex
parents: 5068
diff changeset
263 if(id > MAX_V_STREAMS-1 || id < 0)
4642
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
264 {
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
265 mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested video stream id overflow (%d > %d)\n",
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
266 id, MAX_V_STREAMS);
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
267 return NULL;
e534c7dc0cc0 check for overflow in new_sh_video and new_sh_audio
alex
parents: 4587
diff changeset
268 }
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
269 if(demuxer->v_streams[id]){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
270 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_VideoStreamRedefined,id);
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
271 } else {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
272 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id);
20072
3f63d6e12a1a Simplify: replace malloc + memset 0 by calloc
reimar
parents: 19862
diff changeset
273 demuxer->v_streams[id]=calloc(1, sizeof(sh_video_t));
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
274 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid);
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
275 }
19540
70a5e89ea4cd Get rid of demux_aid_vid_mismatch mess.
reimar
parents: 19479
diff changeset
276 ((sh_video_t *)demuxer->v_streams[id])->vid = vid;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
277 return demuxer->v_streams[id];
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
278 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
279
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
280 void free_sh_video(sh_video_t* sh){
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
281 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh);
1657
f6d3c1287748 freeing video buffer
arpi
parents: 1643
diff changeset
282 if(sh->bih) free(sh->bih);
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
283 free(sh);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
284 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
285
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
286 void free_demuxer(demuxer_t *demuxer){
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
287 int i;
13946
e632b43f0598 Reduce excessive verbosity.
diego
parents: 13738
diff changeset
288 mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
289 if(demuxer->desc->close)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
290 demuxer->desc->close(demuxer);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
291 // Very ugly hack to make it behave like old implementation
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
292 if (demuxer->desc->type == DEMUXER_TYPE_DEMUXERS)
16291
f443f849531b Do not free demuxer before using demuxer->desc->type (happened when using -audiofile).
reimar
parents: 16198
diff changeset
293 goto skip_streamfree;
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
294 // free streams:
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14502
diff changeset
295 for(i = 0; i < MAX_A_STREAMS; i++)
18708
9e2b300db17b Change free_sh_audio() to take demuxer and stream id as parameters
uau
parents: 18404
diff changeset
296 if(demuxer->a_streams[i]) free_sh_audio(demuxer, i);
14666
91bbfcb66883 Memleak fixes. Based on patch by Timothy Lee (timothy lee at siriushk com).
reimar
parents: 14502
diff changeset
297 for(i = 0; i < MAX_V_STREAMS; i++)
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
298 if(demuxer->v_streams[i]) free_sh_video(demuxer->v_streams[i]);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
299 // free demuxers:
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
300 free_demuxer_stream(demuxer->audio);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
301 free_demuxer_stream(demuxer->video);
5412
db582be1b590 added soem debug prints, and fixed 10l bug of Alban
arpi
parents: 5214
diff changeset
302 free_demuxer_stream(demuxer->sub);
16291
f443f849531b Do not free demuxer before using demuxer->desc->type (happened when using -audiofile).
reimar
parents: 16198
diff changeset
303 skip_streamfree:
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
304 if(demuxer->info) {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
305 for(i=0;demuxer->info[i] != NULL; i++)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
306 free(demuxer->info[i]);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
307 free(demuxer->info);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
308 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
309 if(demuxer->filename)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
310 free(demuxer->filename);
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
311 if (demuxer->chapters) {
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
312 for (i=0; i<demuxer->num_chapters; i++)
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
313 if (demuxer->chapters[i].name)
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
314 free(demuxer->chapters[i].name);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
315 free(demuxer->chapters);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
316 }
1643
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
317 free(demuxer);
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
318 }
76835bed88ca free demux/ds/sh
arpi
parents: 1631
diff changeset
319
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
320
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
321 void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 // demux_packet_t* dp=new_demux_packet(len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 // stream_read(stream,dp->buffer,len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 // dp->pts=pts; //(float)pts/90000.0f;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325 // dp->pos=pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326 // append packet to DS stream:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327 ++ds->packs;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 ds->bytes+=dp->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 if(ds->last){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 // next packet in stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331 ds->last->next=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
332 ds->last=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 // first packet in stream
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 ds->first=ds->last=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
337 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%u [packs: A=%d V=%d]\n",
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
338 (ds==ds->demuxer->audio)?"d_audio":"d_video",
1428
a90d889eb649 largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents: 1421
diff changeset
339 dp->len,dp->pts,(unsigned int)dp->pos,ds->demuxer->audio->packs,ds->demuxer->video->packs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
341
18309
87161f96fa66 Change common pts variables from floats to doubles. Individual demuxers
uau
parents: 18242
diff changeset
342 void ds_read_packet(demux_stream_t *ds, stream_t *stream, int len, double pts, off_t pos, int flags) {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 demux_packet_t* dp=new_demux_packet(len);
10891
65ed62e138fa Fixed 'reading after EOF'. demuxers didn't check, how many they've read!
lumag
parents: 10882
diff changeset
344 len = stream_read(stream,dp->buffer,len);
65ed62e138fa Fixed 'reading after EOF'. demuxers didn't check, how many they've read!
lumag
parents: 10882
diff changeset
345 resize_demux_packet(dp, len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 dp->pts=pts; //(float)pts/90000.0f;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
347 dp->pos=pos;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 889
diff changeset
348 dp->flags=flags;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 // append packet to DS stream:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350 ds_add_packet(ds,dp);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 // 0 = EOF or no stream found or invalid type
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355 // 1 = successfully read a packet
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
356
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358 // Note: parameter 'ds' can be NULL!
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
359 // printf("demux->type=%d\n",demux->type);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
360 return demux->desc->fill_buffer(demux, ds);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
363 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364 // 0 = EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
365 // 1 = succesfull
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
366 int ds_fill_buffer(demux_stream_t *ds){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 demuxer_t *demux=ds->demuxer;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
368 if(ds->current) free_demux_packet(ds->current);
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17636
diff changeset
369 if( mp_msg_test(MSGT_DEMUXER,MSGL_DBG3) ){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
370 if(ds==demux->audio) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_audio) called\n");else
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
371 if(ds==demux->video) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_video) called\n");else
5470
e80d66b5e4a7 added debug printf for dvdsub - from dvdnav patch by Kees Cook <mplayer@outflux.net>
arpi
parents: 5469
diff changeset
372 if(ds==demux->sub) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_sub) called\n");else
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
373 mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(unknown 0x%X) called\n",(unsigned int)ds);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
374 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375 while(1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
376 if(ds->packs){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
377 demux_packet_t *p=ds->first;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
378 // copy useful data:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
379 ds->buffer=p->buffer;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
380 ds->buffer_pos=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
381 ds->buffer_size=p->len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
382 ds->pos=p->pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
383 ds->dpos+=p->len; // !!!
889
1b905517c684 AVI -bps desync problem solved
arpi_esp
parents: 828
diff changeset
384 ++ds->pack_no;
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
385 if (p->pts != (correct_pts ? MP_NOPTS_VALUE : 0)) {
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
386 ds->pts=p->pts;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
387 ds->pts_bytes=0;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
388 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
389 ds->pts_bytes+=p->len; // !!!
21780
c9795699c414 added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents: 21767
diff changeset
390 if(p->stream_pts != MP_NOPTS_VALUE) demux->stream_pts=p->stream_pts;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 889
diff changeset
391 ds->flags=p->flags;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
392 // unlink packet:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
393 ds->bytes-=p->len;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
394 ds->current=p;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
395 ds->first=p->next;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
396 if(!ds->first) ds->last=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
397 --ds->packs;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
398 return 1; //ds->buffer_size;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
399 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
400 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
401 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes);
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
402 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
403 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
405 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){
1584
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
406 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes);
e49b3927c793 more messages for translator :)
arpi
parents: 1567
diff changeset
407 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
408 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
409 }
1421
ea0a0b9e6fbc nosound avi seeking fixed
arpi
parents: 1401
diff changeset
410 if(!demux_fill_buffer(demux,ds)){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
411 mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"ds_fill_buffer()->demux_fill_buffer() failed\n");
1421
ea0a0b9e6fbc nosound avi seeking fixed
arpi
parents: 1401
diff changeset
412 break; // EOF
ea0a0b9e6fbc nosound avi seeking fixed
arpi
parents: 1401
diff changeset
413 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
414 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
415 ds->buffer_pos=ds->buffer_size=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
416 ds->buffer=NULL;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
417 ds->current=NULL;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1497
diff changeset
418 mp_msg(MSGT_DEMUXER,MSGL_V,"ds_fill_buffer: EOF reached (stream: %s) \n",ds==demux->audio?"audio":"video");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 ds->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
422
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
423 int demux_read_data(demux_stream_t *ds,unsigned char* mem,int len){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
424 int x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
425 int bytes=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
426 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
427 x=ds->buffer_size-ds->buffer_pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
428 if(x==0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
429 if(!ds_fill_buffer(ds)) return bytes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
430 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
431 if(x>len) x=len;
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23121
diff changeset
432 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
433 bytes+=x;len-=x;ds->buffer_pos+=x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
434 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
435 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
436 return bytes;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
437 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
438
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
439 int demux_read_data_pack(demux_stream_t *ds,unsigned char* mem,int len){
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
440 int x;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
441 int bytes=0;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
442 while(len>0){
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
443 x=ds->buffer_size-ds->buffer_pos;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
444 if(x==0){
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
445 if(!ds_fill_buffer(ds)) return bytes;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
446 } else {
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
447 if(x>len) x=len;
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23121
diff changeset
448 if(mem) fast_memcpy(mem+bytes,&ds->buffer[ds->buffer_pos],x);
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
449 bytes+=x;len-=x;ds->buffer_pos+=x;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
450 return bytes; // stop at end of package! (for correct timestamping)
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
451 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
452 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
453 return bytes;
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
454 }
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
455
17417
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
456 /**
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
457 * \brief read data until the given 3-byte pattern is encountered, up to maxlen
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
458 * \param mem memory to read data into, may be NULL to discard data
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
459 * \param maxlen maximum number of bytes to read
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
460 * \param read number of bytes actually read
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
461 * \param pattern pattern to search for (lowest 8 bits are ignored)
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
462 * \return whether pattern was found
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
463 */
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
464 int demux_pattern_3(demux_stream_t *ds, unsigned char *mem, int maxlen,
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
465 int *read, uint32_t pattern) {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
466 register uint32_t head = 0xffffff00;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
467 register uint32_t pat = pattern & 0xffffff00;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
468 int total_len = 0;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
469 do {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
470 register unsigned char *ds_buf = &ds->buffer[ds->buffer_size];
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
471 int len = ds->buffer_size - ds->buffer_pos;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
472 register long pos = -len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
473 if (unlikely(pos >= 0)) { // buffer is empty
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
474 ds_fill_buffer(ds);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
475 continue;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
476 }
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
477 do {
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
478 head |= ds_buf[pos];
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
479 head <<= 8;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
480 } while (++pos && head != pat);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
481 len += pos;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
482 if (total_len + len > maxlen)
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
483 len = maxlen - total_len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
484 len = demux_read_data(ds, mem ? &mem[total_len] : NULL, len);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
485 total_len += len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
486 } while ((head != pat || total_len < 3) && total_len < maxlen && !ds->eof);
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
487 if (read)
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
488 *read = total_len;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
489 return total_len >= 3 && head == pat;
960b2fa1567e function to read from a demuxer up to (and including) the specified
reimar
parents: 17366
diff changeset
490 }
746
cd1f0d4de0b8 new audio playback and A-V sync code
arpi_esp
parents: 598
diff changeset
491
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
492 void ds_free_packs(demux_stream_t *ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
493 demux_packet_t *dp=ds->first;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
494 while(dp){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
495 demux_packet_t *dn=dp->next;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
496 free_demux_packet(dp);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
497 dp=dn;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
499 if(ds->asf_packet){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
500 // free unfinished .asf fragments:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
501 free(ds->asf_packet->buffer);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
502 free(ds->asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
503 ds->asf_packet=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
504 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505 ds->first=ds->last=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 ds->packs=0; // !!!!!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
507 ds->bytes=0;
6192
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
508 if(ds->current) free_demux_packet(ds->current);
f03fe2e84efd clone_demux_packet(), using refcounting to avoid memcpy()
arpi
parents: 5930
diff changeset
509 ds->current=NULL;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
510 ds->buffer=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511 ds->buffer_pos=ds->buffer_size;
828
c71695c30006 added pts_bytes=0 to ds_free_packs
arpi_esp
parents: 746
diff changeset
512 ds->pts=0; ds->pts_bytes=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
513 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
514
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
515 int ds_get_packet(demux_stream_t *ds,unsigned char **start){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516 while(1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
518 if(ds->buffer_pos>=ds->buffer_size){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
519 if(!ds_fill_buffer(ds)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
520 // EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
521 *start = NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
522 return -1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
523 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
524 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
525 len=ds->buffer_size-ds->buffer_pos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
526 *start = &ds->buffer[ds->buffer_pos];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
527 ds->buffer_pos+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
528 return len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
529 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
530 }
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
531
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
532 int ds_get_packet_pts(demux_stream_t *ds,unsigned char **start, double *pts)
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
533 {
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
534 int len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
535 *pts = MP_NOPTS_VALUE;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
536 if(ds->buffer_pos>=ds->buffer_size){
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
537 if (!ds_fill_buffer(ds)) {
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
538 // EOF
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
539 *start = NULL;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
540 return -1;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
541 }
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
542 }
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
543 // Should use MP_NOPTS_VALUE for "unknown pts" in the packets too
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
544 // Return pts unless this read starts from the middle of a packet
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
545 if (!ds->buffer_pos && (correct_pts || ds->current->pts))
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
546 *pts = ds->current->pts;
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
547 len=ds->buffer_size-ds->buffer_pos;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
548 *start = &ds->buffer[ds->buffer_pos];
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
549 ds->buffer_pos+=len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
550 return len;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
551 }
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18237
diff changeset
552
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 554
diff changeset
553 int ds_get_packet_sub(demux_stream_t *ds,unsigned char **start){
554
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
554 while(1){
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
555 int len;
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
556 if(ds->buffer_pos>=ds->buffer_size){
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
557 *start = NULL;
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
558 if(!ds->packs) return -1; // no sub
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
559 if(!ds_fill_buffer(ds)) return -1; // EOF
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
560 }
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
561 len=ds->buffer_size-ds->buffer_pos;
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
562 *start = &ds->buffer[ds->buffer_pos];
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
563 ds->buffer_pos+=len;
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
564 return len;
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
565 }
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
566 }
d8b3c80604e3 dvd sub parser move dto mplayer.c
arpi_esp
parents: 552
diff changeset
567
18309
87161f96fa66 Change common pts variables from floats to doubles. Individual demuxers
uau
parents: 18242
diff changeset
568 double ds_get_next_pts(demux_stream_t *ds)
87161f96fa66 Change common pts variables from floats to doubles. Individual demuxers
uau
parents: 18242
diff changeset
569 {
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
570 demuxer_t* demux = ds->demuxer;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
571 while(!ds->first) {
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
572 if(demux->audio->packs>=MAX_PACKS || demux->audio->bytes>=MAX_PACK_BYTES){
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
573 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyAudioInBuffer,demux->audio->packs,demux->audio->bytes);
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
574 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
21809
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21785
diff changeset
575 return MP_NOPTS_VALUE;
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
576 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
577 if(demux->video->packs>=MAX_PACKS || demux->video->bytes>=MAX_PACK_BYTES){
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
578 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_TooManyVideoInBuffer,demux->video->packs,demux->video->bytes);
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
579 mp_msg(MSGT_DEMUXER,MSGL_HINT,MSGTR_MaybeNI);
21809
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21785
diff changeset
580 return MP_NOPTS_VALUE;
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
581 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
582 if(!demux_fill_buffer(demux,ds))
21809
2c473e083c70 Make ds_get_next_pts return MP_NOPTS_VALUE instead of -1 on error,
reimar
parents: 21785
diff changeset
583 return MP_NOPTS_VALUE;
5930
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
584 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
585 return ds->first->pts;
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
586 }
68cac7ecaf05 Fix frame_time for variable fps movies as it was the last frame duration.
albeu
parents: 5897
diff changeset
587
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
588 // ====================================================================
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
589
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
590 // commandline options, flags:
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
591 extern int force_ni;
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
592 extern int pts_from_bps;
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
593
7559
b645204ea527 some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents: 7482
diff changeset
594 //extern int audio_id;
b645204ea527 some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents: 7482
diff changeset
595 //extern int video_id;
b645204ea527 some cleanup - made private vars/funcs static, removed obsolete externs
arpi
parents: 7482
diff changeset
596 //extern int dvdsub_id;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
597
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
598 void demuxer_help(void)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
599 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
600 int i;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
601
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
602 mp_msg(MSGT_DEMUXER, MSGL_INFO, "Available demuxers:\n");
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
603 mp_msg(MSGT_DEMUXER, MSGL_INFO, " demuxer: type info: (comment)\n");
18237
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 18128
diff changeset
604 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_DEMUXERS\n");
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
605 for (i = 0; demuxer_list[i]; i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
606 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Don't display special demuxers
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
607 continue;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
608 if (demuxer_list[i]->comment && strlen(demuxer_list[i]->comment))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
609 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s (%s)\n",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
610 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info, demuxer_list[i]->comment);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
611 else
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
612 mp_msg(MSGT_DEMUXER, MSGL_INFO, "%10s %2d %s\n",
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
613 demuxer_list[i]->name, demuxer_list[i]->type, demuxer_list[i]->info);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
614 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
615 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
616
14693
37116118ab6a avisynth demuxer patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents: 14666
diff changeset
617
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
618 /**
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
619 * Get demuxer type for a given demuxer name
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
620 *
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
621 * @param demuxer_name string with demuxer name of demuxer number
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
622 * @param force will be set if demuxer should be forced.
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
623 * May be NULL.
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
624 * @return DEMUXER_TYPE_xxx, -1 if error or not found
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
625 */
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
626 int get_demuxer_type_from_name(char *demuxer_name, int *force)
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
627 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
628 int i;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
629 long type_int;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
630 char *endptr;
5133
9841a86d66f9 Initial ogg demuxer. No seeking, a/v sync is broken. Support avi
albeu
parents: 5107
diff changeset
631
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
632 if (!demuxer_name || !demuxer_name[0])
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
633 return DEMUXER_TYPE_UNKNOWN;
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
634 if (force) *force = demuxer_name[0] == '+';
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
635 if (demuxer_name[0] == '+')
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
636 demuxer_name = &demuxer_name[1];
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
637 for (i = 0; demuxer_list[i]; i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
638 if (demuxer_list[i]->type > DEMUXER_TYPE_MAX) // Can't select special demuxers from commandline
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
639 continue;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
640 if (strcmp(demuxer_name, demuxer_list[i]->name) == 0)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
641 return demuxer_list[i]->type;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
642 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
643
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
644 // No match found, try to parse name as an integer (demuxer number)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
645 type_int = strtol(demuxer_name, &endptr, 0);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
646 if (*endptr) // Conversion failed
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
647 return -1;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
648 if ((type_int > 0) && (type_int <= DEMUXER_TYPE_MAX))
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
649 return (int)type_int;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
650
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
651 return -1;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
652 }
3801
3cea69dda1b3 added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents: 3786
diff changeset
653
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
654 int extension_parsing=1; // 0=off 1=mixed (used only for unstable formats)
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents: 6192
diff changeset
655
18917
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
656 int correct_pts=0;
d9a75b26da6c Add a new video pts tracking mode, enabled by option -correct-pts.
uau
parents: 18900
diff changeset
657
9751
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
658 /*
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
659 NOTE : Several demuxers may be opened at the same time so
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
660 demuxers should NEVER rely on an external var to enable them
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
661 self. If a demuxer can't do any autodection it should only use
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
662 file_format. The user can explictly set file_format with the -demuxer
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
663 option so there is really no need for another extra var.
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
664 For conivence an option can be added to set file_format directly
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
665 to the right type (ex: rawaudio,rawvideo).
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
666 Also the stream can override the file_format so a demuxer wich rely
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
667 on a special stream type can set file_format at the stream level
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
668 (ex: tv,mf).
00c97b0891e3 Fix all demuxers wich where using a global var to enable themself.
albeu
parents: 9709
diff changeset
669 */
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
670
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
671 static demuxer_t* demux_open_stream(stream_t *stream, int file_format,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
672 int force, int audio_id, int video_id, int dvdsub_id,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
673 char* filename) {
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
674
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
675 //int file_format=(*file_format_ptr);
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
676
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
677 demuxer_t *demuxer=NULL;
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
678
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
679 sh_video_t *sh_video=NULL;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
680
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
681 demuxer_desc_t *demuxer_desc;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
682 int fformat;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
683 int i;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
684
1659
6b71bbf515e4 num_elementary_packets1xx reset
arpi
parents: 1657
diff changeset
685 //printf("demux_open(%p,%d,%d,%d,%d) \n",stream,file_format,audio_id,video_id,dvdsub_id);
6b71bbf515e4 num_elementary_packets1xx reset
arpi
parents: 1657
diff changeset
686
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
687 // If somebody requested a demuxer check it
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
688 if (file_format) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
689 if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
690 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
20318
d8d2bc754413 Fix opening of demuxers without check_file function, broken by r20309.
reimar
parents: 20303
diff changeset
691 if (demuxer_desc->check_file)
16413
a07354861027 execute the check function even when a demuxer is forced, to avoid crashes.
reimar
parents: 16412
diff changeset
692 fformat = demuxer_desc->check_file(demuxer);
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
693 if (force || !demuxer_desc->check_file)
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
694 fformat = demuxer_desc->type;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
695 if (fformat != 0) {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
696 if (fformat == demuxer_desc->type) {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
697 demuxer_t *demux2 = demuxer;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
698 // Move messages to demuxer detection code?
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
699 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
700 file_format = demuxer_desc->type = fformat;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
701 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
702 demuxer = demux2;
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
703 goto dmx_open;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
704 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
705 } else {
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
706 // Format changed after check, recurse
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
707 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
708 return demux_open_stream(stream, fformat, force,
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
709 audio_id, video_id, dvdsub_id, filename);
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
710 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
711 }
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
712 // Check failed for forced demuxer, quit
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
713 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
714 return NULL;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
715 }
9065
59805b2d220a raw video demuxer, requested by Michael
arpi
parents: 9006
diff changeset
716 }
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents: 6192
diff changeset
717
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
718 // Test demuxers with safe file checks
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
719 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
720 if (demuxer_desc->safe_check) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
721 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
722 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
723 if (fformat == demuxer_desc->type) {
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
724 demuxer_t *demux2 = demuxer;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
725 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
726 file_format = fformat;
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
727 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
728 demuxer = demux2;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
729 goto dmx_open;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
730 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
731 } else {
16326
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
732 if (fformat == DEMUXER_TYPE_PLAYLIST)
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
733 return demuxer; // handled in mplayer.c
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
734 // Format changed after check, recurse
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
735 free_demuxer(demuxer);
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
736 demuxer=demux_open_stream(stream, fformat, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
737 audio_id, video_id, dvdsub_id, filename);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
738 if(demuxer) return demuxer; // done!
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
739 file_format = DEMUXER_TYPE_UNKNOWN;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
740 }
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
741 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
742 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
743 demuxer = NULL;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
744 }
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
745 }
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
746
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
747 // If no forced demuxer perform file extension based detection
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
748 // Ok. We're over the stable detectable fileformats, the next ones are a bit
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
749 // fuzzy. So by default (extension_parsing==1) try extension-based detection
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
750 // first:
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
751 if(file_format==DEMUXER_TYPE_UNKNOWN && filename && extension_parsing==1){
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
752 file_format=demuxer_type_by_filename(filename);
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
753 if(file_format!=DEMUXER_TYPE_UNKNOWN){
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
754 // we like recursion :)
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
755 demuxer=demux_open_stream(stream, file_format, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
756 audio_id, video_id, dvdsub_id, filename);
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
757 if(demuxer) return demuxer; // done!
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
758 file_format=DEMUXER_TYPE_UNKNOWN; // continue fuzzy guessing...
10379
296064e1baf0 fixed mpeg-ps ext-based detection sig11 bug reporetd by Raindel Shachar
arpi
parents: 10310
diff changeset
759 mp_msg(MSGT_DEMUXER,MSGL_V,"demuxer: continue fuzzy content-based format guessing...\n");
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
760 }
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
761 }
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
762
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
763 // Try detection for all other demuxers
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
764 for (i = 0; (demuxer_desc = demuxer_list[i]); i++) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
765 if (!demuxer_desc->safe_check && demuxer_desc->check_file) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
766 demuxer = new_demuxer(stream,demuxer_desc->type,audio_id,video_id,dvdsub_id,filename);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
767 if ((fformat = demuxer_desc->check_file(demuxer)) != 0) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
768 if (fformat == demuxer_desc->type) {
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
769 demuxer_t *demux2 = demuxer;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
770 mp_msg(MSGT_DEMUXER, MSGL_INFO, MSGTR_Detected_XXX_FileFormat, demuxer_desc->shortdesc);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
771 file_format = fformat;
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
772 if (!demuxer->desc->open || (demux2 = demuxer->desc->open(demuxer))) {
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
773 demuxer = demux2;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
774 goto dmx_open;
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
775 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
776 } else {
16326
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
777 if (fformat == DEMUXER_TYPE_PLAYLIST)
88b9c7b0e773 Fix move playlists (control must be returned to mplayer.c, with the demuxer
reimar
parents: 16321
diff changeset
778 return demuxer; // handled in mplayer.c
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
779 // Format changed after check, recurse
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
780 free_demuxer(demuxer);
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
781 demuxer=demux_open_stream(stream, fformat, force,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
782 audio_id, video_id, dvdsub_id, filename);
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
783 if(demuxer) return demuxer; // done!
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
784 file_format = DEMUXER_TYPE_UNKNOWN;
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
785 }
20303
21dd6cf54fff Try other demuxers if open() fails.
reimar
parents: 20072
diff changeset
786 }
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
787 free_demuxer(demuxer);
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
788 demuxer = NULL;
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
789 }
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
790 }
15670
081bee8052cf moved mpeg-ps/es probing code to demux_mpg.c
nicodvb
parents: 15576
diff changeset
791
20319
03e64a7a6d5e Cosmetics: indentation fix indentation broken by last two demuxer.c commits
reimar
parents: 20318
diff changeset
792 return NULL;
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
793 //====== File format recognized, set up these for compatibility: =========
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
794 dmx_open:
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
795
1485
b895f95e7657 AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents: 1456
diff changeset
796 demuxer->file_format=file_format;
b895f95e7657 AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents: 1456
diff changeset
797
16477
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
798 if ((sh_video=demuxer->video->sh) && sh_video->bih){
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
799 int biComp=le2me_32(sh_video->bih->biCompression);
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17354
diff changeset
800 mp_msg(MSGT_DEMUX,MSGL_INFO,"VIDEO: [%.4s] %dx%d %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n",
16477
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
801 (char *)&biComp,
13301
638673d1f83a show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents: 13006
diff changeset
802 sh_video->bih->biWidth,
638673d1f83a show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents: 13006
diff changeset
803 sh_video->bih->biHeight,
638673d1f83a show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents: 13006
diff changeset
804 sh_video->bih->biBitCount,
638673d1f83a show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents: 13006
diff changeset
805 sh_video->fps,
638673d1f83a show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents: 13006
diff changeset
806 sh_video->i_bps*0.008f,
638673d1f83a show video format for all demuxers, not just avi (move this somewhere else if you prefer)
rfelker
parents: 13006
diff changeset
807 sh_video->i_bps/1024.0f );
16477
c2e0e8c6f00a Make the fourcc output endianness-independent.
diego
parents: 16413
diff changeset
808 }
1375
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
809 return demuxer;
dbcb5b5e1fae file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents: 1331
diff changeset
810 }
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
811
6623
7bc4c6ba9485 add -audiofile support for gui
pontscho
parents: 6384
diff changeset
812 char* audio_stream = NULL;
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
813 char* sub_stream = NULL;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
814 int demuxer_type = 0; // used by rawaudio and rawvideo
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
815 int audio_stream_cache = 0;
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
816
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
817 char *demuxer_name = NULL; // parameter from -demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
818 char *audio_demuxer_name = NULL; // parameter from -audio-demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
819 char *sub_demuxer_name = NULL; // parameter from -sub-demuxer
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
820
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
821 extern int hr_mp3_seek;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
822
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
823 extern float stream_cache_min_percent;
16152
10a69a812eff remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents: 15958
diff changeset
824 extern float stream_cache_seek_min_percent;
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
825
9006
d00997f12257 extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
arpi
parents: 8937
diff changeset
826 demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
827 stream_t *as = NULL,*ss = NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
828 demuxer_t *vd,*ad = NULL,*sd = NULL;
12223
e7c8200ffdc5 Respect -playlist for asx streams
rtognimp
parents: 12175
diff changeset
829 int afmt =DEMUXER_TYPE_UNKNOWN,sfmt = DEMUXER_TYPE_UNKNOWN ;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
830 int audio_demuxer_type = 0, sub_demuxer_type = 0;
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
831 int demuxer_force = 0, audio_demuxer_force = 0,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
832 sub_demuxer_force = 0;
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
833
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
834 if ((demuxer_type = get_demuxer_type_from_name(demuxer_name, &demuxer_force)) < 0) {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
835 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-demuxer %s does not exist.\n",demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
836 }
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
837 if ((audio_demuxer_type = get_demuxer_type_from_name(audio_demuxer_name, &audio_demuxer_force)) < 0) {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
838 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-audio-demuxer %s does not exist.\n",audio_demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
839 }
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
840 if ((sub_demuxer_type = get_demuxer_type_from_name(sub_demuxer_name, &sub_demuxer_force)) < 0) {
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
841 mp_msg(MSGT_DEMUXER,MSGL_ERR,"-sub-demuxer %s does not exist.\n",sub_demuxer_name);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
842 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
843
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
844 if(audio_stream) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
845 as = open_stream(audio_stream,0,&afmt);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
846 if(!as) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
847 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenAudioStream,audio_stream);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
848 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
849 }
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
850 if(audio_stream_cache) {
12835
4235ae5a2d60 cache min fill adjustment, based on patch by Jeremy Huddleston
iive
parents: 12434
diff changeset
851 if(!stream_enable_cache(as,audio_stream_cache*1024,audio_stream_cache*1024*(stream_cache_min_percent / 100.0),
16152
10a69a812eff remove unused cache-prefill and create cache-seek-min that controls when seek_long is prefered over waiting for cache to fill
iive
parents: 15958
diff changeset
852 audio_stream_cache*1024*(stream_cache_seek_min_percent / 100.0))) {
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
853 free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
854 mp_msg(MSGT_DEMUXER,MSGL_ERR,"Can't enable audio stream cache\n");
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
855 return NULL;
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
856 }
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
857 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
858 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
859 if(sub_stream) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
860 ss = open_stream(sub_stream,0,&sfmt);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
861 if(!ss) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
862 mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_CannotOpenSubtitlesStream,sub_stream);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
863 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
864 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
865 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
866
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
867 vd = demux_open_stream(vs, demuxer_type ? demuxer_type : file_format,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
868 demuxer_force, audio_stream ? -2 : audio_id, video_id,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
869 sub_stream ? -2 : dvdsub_id, filename);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
870 if(!vd) {
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
871 if(as) free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
872 if(ss) free_stream(ss);
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
873 return NULL;
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
874 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
875 if(as) {
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
876 ad = demux_open_stream(as, audio_demuxer_type ? audio_demuxer_type : afmt,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
877 audio_demuxer_force, audio_id, -2, -2, audio_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
878 if(!ad) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
879 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
880 free_stream(as);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
881 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
882 else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->format == 0x55) // MP3
7867
3dc0b71630ff cleanup config option handling in libmpdemux.
arpi
parents: 7754
diff changeset
883 hr_mp3_seek=1; // Enable high res seeking
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
884 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
885 if(ss) {
16321
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
886 sd = demux_open_stream(ss, sub_demuxer_type ? sub_demuxer_type : sfmt,
efbfac98cab1 Allow forcing of demuxers and codecs by prepending '+'
reimar
parents: 16310
diff changeset
887 sub_demuxer_force, -2, -2, dvdsub_id, sub_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
888 if(!sd) {
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
889 mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream);
9709
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
890 free_stream(ss);
1b1e33d1688a Fix rawvideo and -audiofile
albeu
parents: 9610
diff changeset
891 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
892 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
893
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
894 if(ad && sd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
895 return new_demuxers_demuxer(vd,ad,sd);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
896 else if(ad)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
897 return new_demuxers_demuxer(vd,ad,vd);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
898 else if(sd)
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
899 return new_demuxers_demuxer(vd,vd,sd);
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
900 else
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
901 return vd;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
902 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
903
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
904
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
905 int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
906 demux_stream_t *d_audio=demuxer->audio;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
907 demux_stream_t *d_video=demuxer->video;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
908 sh_audio_t *sh_audio=d_audio->sh;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
909 sh_video_t *sh_video=d_video->sh;
20851
6602a90a06ec consistency fix: STREAM_CTRL_GET_TIME_LENGTH and STREAM_CTRL_GET_CURRENT_TIME now return time in (double) seconds
nicodvb
parents: 20841
diff changeset
910 double tmp = 0;
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
911 double pts;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
912
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
913 if(!demuxer->seekable){
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
914 if(demuxer->file_format==DEMUXER_TYPE_AVI)
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1659
diff changeset
915 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekRawAVI);
2790
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
916 #ifdef USE_TV
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
917 else if (demuxer->file_format==DEMUXER_TYPE_TV)
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
918 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_TVInputNotSeekable);
2790
98769cea155c added tv subsystem
alex
parents: 2687
diff changeset
919 #endif
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
920 else
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1659
diff changeset
921 mp_msg(MSGT_SEEK,MSGL_WARN,MSGTR_CantSeekFile);
1623
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
922 return 0;
5908dd344067 added demuxer->seekable flag to generalize seeking ability test
arpi
parents: 1584
diff changeset
923 }
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
924
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
925 // clear demux buffers:
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
926 if(sh_audio){ ds_free_packs(d_audio);sh_audio->a_buffer_len=0;}
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
927 ds_free_packs(d_video);
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
928
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
929 demuxer->stream->eof=0; // clear eof flag
3542
465329581ad8 reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents: 3411
diff changeset
930 demuxer->video->eof=0;
465329581ad8 reset ds eof flags at seeking - requires for mpeg -loop
arpi
parents: 3411
diff changeset
931 demuxer->audio->eof=0;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
932
4203
7cfa69df9e0b reverted old seeking method - ask Holm why...
arpi
parents: 4189
diff changeset
933 #if 0
3824
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
934 if(sh_audio) sh_audio->timer=sh_video->timer;
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
935 #else
4587
886bf5274992 Audio only support. Include a fix in the asf demuxer opening.
albeu
parents: 4565
diff changeset
936 if(sh_video) sh_video->timer=0; // !!!!!!
3824
be5e58955f57 don't reset timer at seek - req. for dxr3
arpi
parents: 3801
diff changeset
937 #endif
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
938
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
939 if(flags & 1) // absolute seek
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
940 pts = 0.0f;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
941 else {
21780
c9795699c414 added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents: 21767
diff changeset
942 if(demuxer->stream_pts == MP_NOPTS_VALUE)
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
943 goto dmx_seek;
21780
c9795699c414 added stream_pts to demuxer_t and demux_packet_t to hold the time value reported by the stream layer
nicodvb
parents: 21767
diff changeset
944 pts = demuxer->stream_pts;
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
945 }
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
946
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
947 if(flags & 2) { // percent seek
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
948 if(stream_control(demuxer->stream, STREAM_CTRL_GET_TIME_LENGTH, &tmp) == STREAM_UNSUPORTED)
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
949 goto dmx_seek;
20851
6602a90a06ec consistency fix: STREAM_CTRL_GET_TIME_LENGTH and STREAM_CTRL_GET_CURRENT_TIME now return time in (double) seconds
nicodvb
parents: 20841
diff changeset
950 pts += tmp * rel_seek_secs;
20748
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
951 } else
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
952 pts += rel_seek_secs;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
953
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
954 if(stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_TIME, &pts) != STREAM_UNSUPORTED) {
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
955 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
956 return 1;
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
957 }
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
958
865b71a83296 now demux_seek() tries to seek aided by the stream layer, if possible
nicodvb
parents: 20319
diff changeset
959 dmx_seek:
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
960 if (demuxer->desc->seek)
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17569
diff changeset
961 demuxer->desc->seek(demuxer,rel_seek_secs,audio_delay,flags);
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
962
16877
9081ae3a702c move resync_audio_stream after seeking to demuxer.c
reimar
parents: 16572
diff changeset
963 if (sh_audio) resync_audio_stream(sh_audio);
9081ae3a702c move resync_audio_stream after seeking to demuxer.c
reimar
parents: 16572
diff changeset
964
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
965 return 1;
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
966 }
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
967
19053
75327b24e06f marks several string parameters as const, as they are not modified inside the function, Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents: 18917
diff changeset
968 int demux_info_add(demuxer_t *demuxer, const char *opt, const char *param)
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
969 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
970 char **info = demuxer->info;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
971 int n = 0;
1497
ad4d402b3d29 seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents: 1496
diff changeset
972
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
973
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
974 for(n = 0; info && info[2*n] != NULL; n++)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
975 {
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
976 if(!strcasecmp(opt,info[2*n]))
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
977 {
19413
acd26ccbff0d Update information and print new value when demux_info_add is called
reimar
parents: 19342
diff changeset
978 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_DemuxerInfoChanged,opt,param);
acd26ccbff0d Update information and print new value when demux_info_add is called
reimar
parents: 19342
diff changeset
979 free(info[2*n+1]);
acd26ccbff0d Update information and print new value when demux_info_add is called
reimar
parents: 19342
diff changeset
980 info[2*n+1] = strdup(param);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
981 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
982 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
983 }
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
984
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
985 info = demuxer->info = (char**)realloc(info,(2*(n+2))*sizeof(char*));
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
986 info[2*n] = strdup(opt);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
987 info[2*n+1] = strdup(param);
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
988 memset(&info[2*(n+1)],0,2*sizeof(char*));
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
989
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
990 return 1;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
991 }
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
992
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
993 int demux_info_print(demuxer_t *demuxer)
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
994 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
995 char **info = demuxer->info;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
996 int n;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
997
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
998 if(!info)
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
999 return 0;
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1000
6951
0504c8beccba messages moved again
jaf
parents: 6943
diff changeset
1001 mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo);
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1002 for(n = 0; info[2*n] != NULL ; n++)
15789
32d9c8a0a02b adds some more -identify output, patch by kiriuja < mplayer DASH patches PAM en DASH directo POUM net>
gpoirier
parents: 15780
diff changeset
1003 {
4694
a21735031d6a Audio file demuxer. Extended version for demuxer info.
albeu
parents: 4660
diff changeset
1004 mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]);
18237
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 18128
diff changeset
1005 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_NAME%d=%s\n", n, info[2*n]);
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 18128
diff changeset
1006 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_VALUE%d=%s\n", n, info[2*n+1]);
15789
32d9c8a0a02b adds some more -identify output, patch by kiriuja < mplayer DASH patches PAM en DASH directo POUM net>
gpoirier
parents: 15780
diff changeset
1007 }
18237
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 18128
diff changeset
1008 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CLIP_INFO_N=%d\n", n);
4189
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
1009
6871d97e4261 initial support for FILM file demuxing
melanson
parents: 4065
diff changeset
1010 return 0;
3050
9ed968c05954 added demuxer_info
alex
parents: 2931
diff changeset
1011 }
4765
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1012
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1013 char* demux_info_get(demuxer_t *demuxer, char *opt) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1014 int i;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1015 char **info = demuxer->info;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1016
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1017 for(i = 0; info && info[2*i] != NULL; i++) {
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1018 if(!strcasecmp(opt,info[2*i]))
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1019 return info[2*i+1];
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1020 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1021
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1022 return NULL;
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1023 }
d0c2c8af46b4 Demuxers demuxer support for using external audiofile (or muxed subtitles).
albeu
parents: 4735
diff changeset
1024
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1025 int demux_control(demuxer_t *demuxer, int cmd, void *arg) {
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1026
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1027 if (demuxer->desc->control)
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1028 return demuxer->desc->control(demuxer,cmd,arg);
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1029
6b86089c2edd Demuxer modularization
rtognimp
parents: 16152
diff changeset
1030 return DEMUXER_CTRL_NOTIMPL;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1031 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1032
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1033
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1034
16346
6ff303d2876b Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents: 16326
diff changeset
1035 double demuxer_get_time_length(demuxer_t *demuxer){
6ff303d2876b Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents: 16326
diff changeset
1036 double get_time_ans;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1037 sh_video_t *sh_video = demuxer->video->sh;
16925
4bce034eeb0a estimate total time also for audio-only files.
reimar
parents: 16877
diff changeset
1038 sh_audio_t *sh_audio = demuxer->audio->sh;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1039 // <= 0 means DEMUXER_CTRL_NOTIMPL or DEMUXER_CTRL_DONTKNOW
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1040 if (demux_control(demuxer, DEMUXER_CTRL_GET_TIME_LENGTH,(void *)&get_time_ans)<=0) {
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1041 if (sh_video && sh_video->i_bps)
16346
6ff303d2876b Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents: 16326
diff changeset
1042 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/sh_video->i_bps;
16925
4bce034eeb0a estimate total time also for audio-only files.
reimar
parents: 16877
diff changeset
1043 else if (sh_audio && sh_audio->i_bps)
4bce034eeb0a estimate total time also for audio-only files.
reimar
parents: 16877
diff changeset
1044 get_time_ans = (double)(demuxer->movi_end-demuxer->movi_start)/sh_audio->i_bps;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1045 else
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1046 get_time_ans=0;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1047 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1048 return get_time_ans;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1049 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1050
20749
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1051 /**
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1052 * \brief demuxer_get_current_time() returns the time of the current play in three possible ways:
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1053 * either when the stream reader satisfies STREAM_CTRL_GET_CURRENT_TIME (e.g. dvd)
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1054 * or using sh_video->pts when the former method fails
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1055 * 0 otherwise
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1056 * \return the current play time
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1057 */
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1058 int demuxer_get_current_time(demuxer_t *demuxer){
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1059 double get_time_ans = 0;
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1060 sh_video_t *sh_video = demuxer->video->sh;
21782
99ab6c41eb1e use demuxer->stream_pts rather than stream_control(STREAM_CTRL_GET_CURRENT_TIME)
nicodvb
parents: 21780
diff changeset
1061 if(demuxer->stream_pts != MP_NOPTS_VALUE)
99ab6c41eb1e use demuxer->stream_pts rather than stream_control(STREAM_CTRL_GET_CURRENT_TIME)
nicodvb
parents: 21780
diff changeset
1062 get_time_ans = demuxer->stream_pts;
99ab6c41eb1e use demuxer->stream_pts rather than stream_control(STREAM_CTRL_GET_CURRENT_TIME)
nicodvb
parents: 21780
diff changeset
1063 else if(sh_video) get_time_ans = sh_video->pts;
20749
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1064 return (int) get_time_ans;
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1065 }
eafd9953b505 added demuxer_get_current_time() to get the current playtime (possibly aided by the stream layer)
nicodvb
parents: 20748
diff changeset
1066
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1067 int demuxer_get_percent_pos(demuxer_t *demuxer){
14197
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1068 int ans = 0;
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1069 int res = demux_control(demuxer, DEMUXER_CTRL_GET_PERCENT_POS, &ans);
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1070 int len = (demuxer->movi_end - demuxer->movi_start) / 100;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1071 if (res <= 0) {
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1072 if (len > 0)
14197
2ae224195625 Use demuxer_get_percent_pos for the OSD position bar
reimar
parents: 14160
diff changeset
1073 ans = (demuxer->filepos - demuxer->movi_start) / len;
14502
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1074 else
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1075 ans = 0;
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1076 }
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1077 if (ans < 0) ans = 0;
8769fa370f83 Move generic length and percent pos calculation to demuxer.c
reimar
parents: 14276
diff changeset
1078 if (ans > 100) ans = 100;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1079 return ans;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1080 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
1081
15285
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1082 int demuxer_switch_audio(demuxer_t *demuxer, int index){
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1083 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_AUDIO, &index);
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1084 if (res == DEMUXER_CTRL_NOTIMPL)
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1085 index = demuxer->audio->id;
39eb8a327ea9 adds a parameter to the switch_audio command to directly select a track.
reimar
parents: 15046
diff changeset
1086 return index;
15046
b7aa70b05d76 Added support of audio stream switching in the MPEG demuxer using the #-key
gpoirier
parents: 14934
diff changeset
1087 }
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1088
20948
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1089 int demuxer_switch_video(demuxer_t *demuxer, int index){
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1090 int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index);
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1091 if (res == DEMUXER_CTRL_NOTIMPL)
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1092 index = demuxer->video->id;
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1093 return index;
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1094 }
7c91b80cabc1 added code to switch video stream
nicodvb
parents: 20872
diff changeset
1095
19342
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1096 int demuxer_add_chapter(demuxer_t* demuxer, const char* name, uint64_t start, uint64_t end){
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1097 if (demuxer->chapters == NULL)
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1098 demuxer->chapters = malloc (32*sizeof(*demuxer->chapters));
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1099 else if (!(demuxer->num_chapters % 32))
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1100 demuxer->chapters = realloc (demuxer->chapters, (demuxer->num_chapters + 32) * sizeof(*demuxer->chapters));
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1101
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1102 demuxer->chapters[demuxer->num_chapters].start = start;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1103 demuxer->chapters[demuxer->num_chapters].end = end;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1104 demuxer->chapters[demuxer->num_chapters].name = strdup(name);
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1105
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1106 return demuxer->num_chapters ++;
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1107 }
4e68a3881201 Add matroska chapter seeking capability.
eugeni
parents: 19053
diff changeset
1108
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1109 /**
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1110 * \brief demuxer_seek_chapter() seeks to a chapter in two possible ways:
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1111 * either using the demuxer->chapters structure set by the demuxer
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1112 * or asking help to the stream layer (e.g. dvd)
19439
28d2d1fddff4 clarification in a comment
nicodvb
parents: 19438
diff changeset
1113 * \param chapter - chapter number wished - 0-based
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1114 * \param mode 0: relative to current main pts, 1: absolute
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1115 * \param seek_pts set by the function to the pts to seek to (if demuxer->chapters is set)
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1116 * \param num_chapters number of chapters present (set by this function is param is not null)
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1117 * \param chapter_name name of chapter found (set by this function is param is not null)
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1118 * \return -1 on error, current chapter if successful
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1119 */
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1120
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1121 int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, float *seek_pts, int *num_chapters, char **chapter_name) {
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1122 int ris;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1123 int current, total;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1124 sh_video_t *sh_video = demuxer->video->sh;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1125 sh_audio_t *sh_audio = demuxer->audio->sh;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1126
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1127 if (!demuxer->num_chapters || !demuxer->chapters) {
19438
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1128 if(!mode) {
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1129 ris = stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, &current);
20841
77a0fe6d0f89 removed duplicated check in demuxer_seek_chapter
nicodvb
parents: 20839
diff changeset
1130 if(ris == STREAM_UNSUPORTED) return -1;
19438
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1131 chapter += current;
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1132 }
263e95c47aec support relative seeking in the stream-driven case
nicodvb
parents: 19435
diff changeset
1133
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1134 if(demuxer->video->sh)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1135 ds_free_packs(demuxer->video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1136
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1137 if(demuxer->audio->sh)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1138 ds_free_packs(demuxer->audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1139
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1140 if(demuxer->sub->id >= 0)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1141 ds_free_packs(demuxer->sub);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1142
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1143 ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER, &chapter);
20839
950ea3171afc in demux_seek() if STREAM_CTRL_SEEK_TO_CHAPTER suceeds call DEMUXER_CTRL_RESYNC to notify the demuxer of the change
nicodvb
parents: 20749
diff changeset
1144 if(ris != STREAM_UNSUPORTED)
950ea3171afc in demux_seek() if STREAM_CTRL_SEEK_TO_CHAPTER suceeds call DEMUXER_CTRL_RESYNC to notify the demuxer of the change
nicodvb
parents: 20749
diff changeset
1145 demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1146 if(sh_video) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1147 ds_fill_buffer(demuxer->video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1148 resync_video_stream(sh_video);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1149 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1150
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1151 if(sh_audio) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1152 ds_fill_buffer(demuxer->audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1153 resync_audio_stream(sh_audio);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1154 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1155
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1156 //exit status may be ok, but main() doesn't have to seek itself (because e.g. dvds depend on sectors, not on pts)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1157 *seek_pts = -1.0;
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1158
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1159 if(num_chapters) {
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1160 if(stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS, num_chapters) == STREAM_UNSUPORTED)
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1161 *num_chapters = 0;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1162 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1163
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1164 if(chapter_name) {
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1165 char *tmp = malloc(16);
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1166 *chapter_name = NULL;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1167 if(num_chapters && *num_chapters && tmp) {
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1168 sprintf(tmp, " of %3d", *num_chapters);
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1169 *chapter_name = tmp;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1170 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1171 }
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1172
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1173 return (ris != STREAM_UNSUPORTED ? chapter : -1);
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1174 } else { //chapters structure is set in the demuxer
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1175 total = demuxer->num_chapters;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1176
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1177 if (mode==1) { //absolute seeking
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1178 current = chapter;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1179 } else { //relative seeking
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1180 uint64_t now;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1181 now = (sh_video ? sh_video->pts : (sh_audio ? sh_audio->pts : 0.)) * 1000 + .5;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1182
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1183 for (current = total - 1; current >= 0; --current) {
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1184 demux_chapter_t* chapter = demuxer->chapters + current;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1185 if (chapter->start <= now)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1186 break;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1187 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1188 current += chapter;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1189 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1190
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1191 if (current >= total)
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1192 return -1;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1193 if (current < 0) current = 0;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1194
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1195 *seek_pts = demuxer->chapters[current].start / 1000.0;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1196
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1197 if(num_chapters)
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1198 *num_chapters = demuxer->num_chapters;
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1199
19479
8dd04ec733f5 100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents: 19478
diff changeset
1200 if(chapter_name) {
8dd04ec733f5 100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents: 19478
diff changeset
1201 if(demuxer->chapters[current].name)
8dd04ec733f5 100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents: 19478
diff changeset
1202 *chapter_name = strdup(demuxer->chapters[current].name);
8dd04ec733f5 100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents: 19478
diff changeset
1203 else *chapter_name = NULL;
8dd04ec733f5 100l: *chapter_name was copied from the pointer rather than strupd()-ed (and next free()d in mplayer.c
nicodvb
parents: 19478
diff changeset
1204 }
19478
bab82c53e433 demuxer_seek_chapter() returns informations about chapters count and name
nicodvb
parents: 19439
diff changeset
1205
19435
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1206 return current;
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1207 }
7bddb8ee9dec added first revision of demuxer_seek_chapter()
nicodvb
parents: 19413
diff changeset
1208 }