annotate libmpdemux/demux_asf.c @ 4559:5dc383bb1c82

added mga_top_reserved module parameter to skip a configurable amount of space at the top of video memory. this is needed to prevent corruption of the kernel's console font when using the "fastfont" option with matroxfb.
author rfelker
date Thu, 07 Feb 2002 02:07:29 +0000
parents 374f2cc73d0d
children 2eaeb73ce8ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 // ASF file parser for DEMUXER v0.3 by A'rpi/ESP-team
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
3 #include <stdio.h>
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
4 #include <stdlib.h>
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1342
diff changeset
5 #include <unistd.h>
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
6
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
7 #include "config.h"
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
8 #include "mp_msg.h"
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1628
diff changeset
9 #include "help_mp.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
10
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
11 #include "stream.h"
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
12 #include "asf.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
13 #include "demuxer.h"
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
14
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 600
diff changeset
15
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
16 /*
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
17 * Load 16/32-bit values in little endian byte order
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
18 * from an unaligned address
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
19 */
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
20 #ifdef ARCH_X86
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
21 #define LOAD_LE32(p) (*(unsigned int*)(p))
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
22 #define LOAD_LE16(p) (*(unsigned short*)(p))
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
23 #else
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
24 #define LOAD_LE32(p) (((unsigned char*)(p))[0] | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
25 ((unsigned char*)(p))[1]<< 8 | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
26 ((unsigned char*)(p))[2]<<16 | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
27 ((unsigned char*)(p))[3]<<24 )
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
28 #define LOAD_LE16(p) (((unsigned char*)(p))[0] | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
29 ((unsigned char*)(p))[1]<<8)
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
30 #endif
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
31
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
32 // defined at asfheader.c:
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
33 extern unsigned char* asf_packet;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
34 extern int asf_scrambling_h;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
35 extern int asf_scrambling_w;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
36 extern int asf_scrambling_b;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
37 extern int asf_packetsize;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
38
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
39
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
40 // based on asf file-format doc by Eugene [http://divx.euro.ru]
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
41
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
42 static void asf_descrambling(unsigned char *src,int len){
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
43 unsigned char *dst=malloc(len);
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
44 unsigned char *s2=src;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
45 int i=0,x,y;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
46 while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
47 // mp_msg(MSGT_DEMUX,MSGL_DBG4,"descrambling! (w=%d b=%d)\n",w,asf_scrambling_b);
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
48 //i+=asf_scrambling_h*asf_scrambling_w;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
49 for(x=0;x<asf_scrambling_w;x++)
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
50 for(y=0;y<asf_scrambling_h;y++){
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
51 memcpy(dst+i,s2+(y*asf_scrambling_w+x)*asf_scrambling_b,asf_scrambling_b);
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
52 i+=asf_scrambling_b;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
53 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
54 s2+=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
55 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
56 //if(i<len) memcpy(dst+i,src+i,len-i);
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
57 memcpy(src,dst,i);
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
58 free(dst);
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
59 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
60
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
61
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
62 static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,unsigned long time,unsigned short dur,int offs,int keyframe){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
63 demux_stream_t *ds=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
64
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
65 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"demux_asf.read_packet: id=%d seq=%d len=%d\n",id,seq,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
66
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
67 if(demux->video->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
68 if(demux->v_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
69 demux->video->id=id;
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
70
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
71 if(demux->audio->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
72 if(demux->a_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
73 demux->audio->id=id;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
74
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 if(id==demux->audio->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76 // audio
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
77 ds=demux->audio;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
78 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
79 ds->sh=demux->a_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
80 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF audio ID = %d\n",ds->id);
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
81 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
83 if(id==demux->video->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
84 // video
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
85 ds=demux->video;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
86 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
87 ds->sh=demux->v_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
88 mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected ASF video ID = %d\n",ds->id);
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
89 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
90 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
91
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
92 if(ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
93 if(ds->asf_packet){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 if(ds->asf_seq!=seq){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95 // closed segment, finalize packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 if(ds==demux->audio)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 if(asf_scrambling_h>1 && asf_scrambling_w>1)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 asf_descrambling(ds->asf_packet->buffer,ds->asf_packet->len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 ds_add_packet(ds,ds->asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 ds->asf_packet=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
102 // append data to it!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 demux_packet_t* dp=ds->asf_packet;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
104 if(dp->len!=offs && offs!=-1) mp_msg(MSGT_DEMUX,MSGL_V,"warning! fragment.len=%d BUT next fragment offset=%d \n",dp->len,offs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 dp->buffer=realloc(dp->buffer,dp->len+len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 memcpy(dp->buffer+dp->len,data,len);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
107 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"data appended! %d+%d\n",dp->len,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108 dp->len+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 // create new packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 { demux_packet_t* dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 if(offs>0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
116 mp_msg(MSGT_DEMUX,MSGL_V,"warning! broken fragment, %d bytes missing \n",offs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 dp=new_demux_packet(len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
120 memcpy(dp->buffer,data,len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 dp->pts=time*0.001f;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
122 dp->flags=keyframe;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 // if(ds==demux->video) printf("ASF time: %8d dur: %5d \n",time,dur);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 dp->pos=demux->filepos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 ds->asf_packet=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 ds->asf_seq=seq;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
133 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
134
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
135 //static int num_elementary_packets100=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 //static int num_elementary_packets101=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 // 0 = EOF or no stream found
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 // 1 = successfully read a packet
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141 int demux_asf_fill_buffer(demuxer_t *demux){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 demux->filepos=stream_tell(demux->stream);
3475
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
144 // Brodcast stream have movi_start==movi_end
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
145 // Better test ?
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
146 if((demux->movi_start != demux->movi_end) && (demux->filepos>=demux->movi_end)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 demux->stream->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
151 stream_read(demux->stream,asf_packet,asf_packetsize);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 if(demux->stream->eof) return 0; // EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 if(asf_packet[0]==0x82){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 unsigned char flags=asf_packet[3];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 unsigned char segtype=asf_packet[4];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 unsigned char* p=&asf_packet[5];
4197
374f2cc73d0d fixed a few possible bugs
arpi
parents: 3475
diff changeset
158 unsigned char* p_end=asf_packet+asf_packetsize;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
159 unsigned long time;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
160 unsigned short duration;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
161 int segs=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
162 unsigned char segsizetype=0x80;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
163 int seg;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 int padding=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 int plen;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 if(verbose>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 for(i=0;i<16;i++) printf(" %02X",asf_packet[i]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
171 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 // Calculate packet size (plen):
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 if(flags&0x40){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 // Explicit (absoulte) packet size
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
178 plen=LOAD_LE16(p); p+=2;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
179 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Explicit packet size specified: %d \n",plen);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
180 if(plen>asf_packetsize) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
181 if(flags&(8|16)){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
182 padding=p[0];p++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 if(flags&16){ padding|=p[0]<<8; p++;}
4197
374f2cc73d0d fixed a few possible bugs
arpi
parents: 3475
diff changeset
184 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Warning! explicit=%d padding=%d \n",plen,asf_packetsize-padding);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
187 // Padding (relative) size
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
188 if(flags&8){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 padding=p[0];++p;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
191 if(flags&16){
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
192 padding=LOAD_LE16(p);p+=2;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
193 }
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
194 plen=asf_packetsize-padding;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
195 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
196
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
197 time = LOAD_LE32(p); p+=4;
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
198 duration = LOAD_LE16(p); p+=2;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
199 if(flags&1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
200 segsizetype=p[0] & 0xC0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
201 segs=p[0] & 0x3F;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
202 ++p;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
203 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
204 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"%08X: flag=%02X segs=%d pad=%d time=%ld dur=%d\n",
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
205 demux->filepos,flags,segs,padding,time,duration);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
206 for(seg=0;seg<segs;seg++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
207 //ASF_segmhdr_t* sh;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
208 unsigned char streamno;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
209 unsigned char seq;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
210 int len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
211 unsigned long x;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
212 unsigned char type;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 unsigned long time2;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
214 int keyframe=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
215
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
216 if(p>=p_end) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! invalid packet 1, sig11 coming soon...\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 if(verbose>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 printf("seg %d:",seg);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
221 for(i=0;i<16;i++) printf(" %02X",p[i]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 streamno=p[0]&0x7F;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
226 if(p[0]&0x80) keyframe=1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 seq=p[1];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 p+=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
229
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 switch(segtype){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 case 0x55:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 x=*((unsigned char*)p);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 p++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
235 case 0x59:
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
236 x=LOAD_LE16(p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 p+=2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 case 0x5D:
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
240 x=LOAD_LE32(p);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 p+=4;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 default:
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
244 mp_msg(MSGT_DEMUX,MSGL_V,"Warning! unknown segtype == 0x%2X \n",segtype);
1327
b12e1817bcc2 some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents: 979
diff changeset
245 x=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 type=p[0]; p++; // 0x01: grouping 0x08: single
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250 switch(type){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 case 0x01:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 //printf("grouping: %02X \n",p[0]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 ++p; // skip unknown byte
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
254 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 case 0x08:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 //printf("!!! obj_length = %d\n",*((unsigned long*)p));
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 p+=4;
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
258 time2=LOAD_LE32(p);p+=4;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260 default:
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
261 mp_msg(MSGT_DEMUX,MSGL_V,"unknown segment type: 0x%02X \n",type);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264 if(flags&1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265 // multiple segments
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 if(segsizetype==0x40){
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
267 len=*((unsigned char*)p);p++; // 1 byte
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
268 } else {
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
269 len=LOAD_LE16(p);p+=2; // 2 byte
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
270 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
271 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
272 // single segment
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
273 len=plen-(p-asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
274 }
4197
374f2cc73d0d fixed a few possible bugs
arpi
parents: 3475
diff changeset
275 if(len<0 || (p+len)>p_end){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
276 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! segment len=%d\n",len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
277 }
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
278 mp_dbg(MSGT_DEMUX,MSGL_DBG4," seg #%d: streamno=%d seq=%d type=%02X len=%d\n",seg,streamno,seq,type,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 switch(type){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281 case 0x01:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282 // GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
283 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 //printf(" total: %d \n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
285 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 int len2=p[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 p++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288 //printf(" group part: %d bytes\n",len2);
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
289 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
290 p+=len2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
291 len-=len2+1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
292 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
293 if(len!=0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
294 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! groups total != len\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
295 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 case 0x08:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
298 // NO GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 //printf("fragment offset: %d \n",sh->x);
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
300 demux_asf_read_packet(demux,p,len,streamno,seq,time2,duration,x,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
301 p+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
302 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
303 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
304
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
305 } // for segs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
306 return 1; // success
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
309 mp_msg(MSGT_DEMUX,MSGL_V,"%08X: UNKNOWN TYPE %02X %02X %02X %02X %02X...\n",demux->filepos,asf_packet[0],asf_packet[1],asf_packet[2],asf_packet[3],asf_packet[4]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
311 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
312
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
313 #include "stheader.h"
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
314
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
315 void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
316 demux_stream_t *d_audio=demuxer->audio;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
317 demux_stream_t *d_video=demuxer->video;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
318 sh_audio_t *sh_audio=d_audio->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
319 // sh_video_t *sh_video=d_video->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
320
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
321 //FIXME: OFF_T - didn't test ASF case yet (don't have a large asf...)
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
322 //FIXME: reports good or bad to steve@daviesfam.org please
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
323
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
324 //================= seek in ASF ==========================
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
325 float p_rate=10; // packets / sec
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
326 off_t rel_seek_packs=(flags&2)? // FIXME: int may be enough?
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
327 (rel_seek_secs*(demuxer->movi_end-demuxer->movi_start)/asf_packetsize):
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
328 (rel_seek_secs*p_rate);
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
329 off_t rel_seek_bytes=rel_seek_packs*asf_packetsize;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
330 off_t newpos;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
331 //printf("ASF: packs: %d duration: %d \n",(int)fileh.packets,*((int*)&fileh.duration));
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
332 // printf("ASF_seek: %d secs -> %d packs -> %d bytes \n",
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
333 // rel_seek_secs,rel_seek_packs,rel_seek_bytes);
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
334 newpos=((flags&1)?demuxer->movi_start:demuxer->filepos)+rel_seek_bytes;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
335 if(newpos<0 || newpos<demuxer->movi_start) newpos=demuxer->movi_start;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
336 // printf("\r -- asf: newpos=%d -- \n",newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
337 stream_seek(demuxer->stream,newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
338
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
339 ds_fill_buffer(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
340 if(sh_audio){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
341 ds_fill_buffer(d_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
342 resync_audio_stream(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
343 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
344
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
345 while(1){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
346 if(sh_audio && !d_audio->eof){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
347 float a_pts=d_audio->pts;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
348 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
349 // sync audio:
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
350 if (d_video->pts > a_pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
351 skip_audio_frame(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
352 // if(!ds_fill_buffer(d_audio)) sh_audio=NULL; // skip audio. EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
353 continue;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
354 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
355 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
356 if(d_video->flags&1) break; // found a keyframe!
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
357 if(!ds_fill_buffer(d_video)) break; // skip frame. EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
358 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
359
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
360
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
361 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
362