annotate libmpdemux/demux_asf.c @ 16513:68890ac57391

Reflect recent changes to the the pan audio filter syntax and behavior in the documentation, patch by Reimar Doeffinger with some fixes by me.
author diego
date Sun, 18 Sep 2005 11:40:06 +0000
parents 6ff303d2876b
children 9081ae3a702c
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
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
15 #include "../libvo/fastmemcpy.h"
833
b8cecdc0c67f Starting implementation of ASF network streaming.
bertrand
parents: 600
diff changeset
16
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
17 /*
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
18 * Load 16/32-bit values in little endian byte order
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
19 * from an unaligned address
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
20 */
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
21 #ifdef ARCH_X86
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
22 #define LOAD_LE32(p) (*(unsigned int*)(p))
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
23 #define LOAD_LE16(p) (*(unsigned short*)(p))
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
24 #else
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
25 #define LOAD_LE32(p) (((unsigned char*)(p))[0] | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
26 ((unsigned char*)(p))[1]<< 8 | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
27 ((unsigned char*)(p))[2]<<16 | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
28 ((unsigned char*)(p))[3]<<24 )
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
29 #define LOAD_LE16(p) (((unsigned char*)(p))[0] | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
30 ((unsigned char*)(p))[1]<<8)
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
31 #endif
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
32
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
33 // defined at asfheader.c:
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
34 extern unsigned char* asf_packet;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
35 extern int asf_scrambling_h;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
36 extern int asf_scrambling_w;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
37 extern int asf_scrambling_b;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
38 extern int asf_packetsize;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
39 extern double asf_packetrate;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
40 extern int asf_movielength;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
41 extern int asf_check_header(demuxer_t *demuxer);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
42 extern int read_asf_header(demuxer_t *demuxer);
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
43
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44 // based on asf file-format doc by Eugene [http://divx.euro.ru]
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
45
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
46 static void asf_descrambling(unsigned char **src,int len){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
47 unsigned char *dst=malloc(len);
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
48 unsigned char *s2=*src;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
49 int i=0,x,y;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
50 while(len-i>=asf_scrambling_h*asf_scrambling_w*asf_scrambling_b){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
51 // 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
52 //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
53 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
54 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
55 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
56 i+=asf_scrambling_b;
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
57 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
58 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
59 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
60 //if(i<len) memcpy(dst+i,src+i,len-i);
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
61 free(*src);
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
62 *src = dst;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
63 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
64
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
65
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
66 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
67 demux_stream_t *ds=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
68
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
69 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
70
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
71 if(demux->video->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
72 if(demux->v_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
73 demux->video->id=id;
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
74
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
75 if(demux->audio->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
76 if(demux->a_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
77 demux->audio->id=id;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
78
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
79 if(id==demux->audio->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
80 // audio
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
81 ds=demux->audio;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
82 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
83 ds->sh=demux->a_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
84 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
85 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
86 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
87 if(id==demux->video->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
88 // video
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
89 ds=demux->video;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
90 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
91 ds->sh=demux->v_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
92 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
93 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
94 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
95
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 if(ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
97 if(ds->asf_packet){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98 if(ds->asf_seq!=seq){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
99 // closed segment, finalize packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
100 if(ds==demux->audio)
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
101 if(asf_scrambling_h>1 && asf_scrambling_w>1)
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
102 asf_descrambling(&ds->asf_packet->buffer,ds->asf_packet->len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
103 ds_add_packet(ds,ds->asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
104 ds->asf_packet=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
106 // append data to it!
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
107 demux_packet_t* dp=ds->asf_packet;
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
108 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
109 dp->buffer=realloc(dp->buffer,dp->len+len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 memcpy(dp->buffer+dp->len,data,len);
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
111 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"data appended! %d+%d\n",dp->len,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
112 dp->len+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
113 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
114 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
115 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 // create new packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 { demux_packet_t* dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 if(offs>0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
120 mp_msg(MSGT_DEMUX,MSGL_V,"warning! broken fragment, %d bytes missing \n",offs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
121 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
122 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
123 dp=new_demux_packet(len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 memcpy(dp->buffer,data,len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125 dp->pts=time*0.001f;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
126 dp->flags=keyframe;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 // if(ds==demux->video) printf("ASF time: %8d dur: %5d \n",time,dur);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
128 dp->pos=demux->filepos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
129 ds->asf_packet=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
130 ds->asf_seq=seq;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
131 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
132 return 1;
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
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
136 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
137 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 //static int num_elementary_packets100=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
140 //static int num_elementary_packets101=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
141
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 // 0 = EOF or no stream found
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
145 static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
146
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 demux->filepos=stream_tell(demux->stream);
3475
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
148 // Brodcast stream have movi_start==movi_end
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
149 // Better test ?
10622
085c10cf912c fixes http://pot.lsd.ro/video.asf
arpi
parents: 8254
diff changeset
150 if((demux->movi_start < demux->movi_end) && (demux->filepos>=demux->movi_end)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 demux->stream->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
155 stream_read(demux->stream,asf_packet,asf_packetsize);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 if(demux->stream->eof) return 0; // EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157
12877
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
158 {
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
159 unsigned char* p=asf_packet;
4197
374f2cc73d0d fixed a few possible bugs
arpi
parents: 3475
diff changeset
160 unsigned char* p_end=asf_packet+asf_packetsize;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
161 unsigned char flags=p[0];
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
162 unsigned char segtype=p[1];
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
163 int padding;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
164 int plen;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
165 int sequence;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
166 unsigned long time=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
167 unsigned short duration=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
168
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 int segs=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 unsigned char segsizetype=0x80;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
171 int seg=-1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
172
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
173 if(verbose>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 for(i=0;i<16;i++) printf(" %02X",asf_packet[i]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178
12877
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
179 // skip ECC data if present by testing bit 7 of flags
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
180 // 1xxxbbbb -> ecc data present, skip bbbb byte(s)
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
181 // 0xxxxxxx -> payload parsing info starts
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
182 if (flags & 0x80)
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
183 {
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
184 p += (flags & 0x0f)+1;
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
185 flags = p[0];
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
186 segtype = p[1];
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
187 }
e427e3cc26c1 skip ecc only if present, patch by Alexis Durelle <alexis.durelle@cen.cnamts.fr> (needed for the Aiptek DV3500 camera)
alex
parents: 10832
diff changeset
188
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
189 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
190
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
191 p+=2; // skip flags & segtype
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
192
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
193 // Read packet size (plen):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
194 switch((flags>>5)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
195 case 3: plen=LOAD_LE32(p);p+=4;break; // dword
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
196 case 2: plen=LOAD_LE16(p);p+=2;break; // word
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
197 case 1: plen=p[0];p++;break; // byte
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 6668
diff changeset
198 default: plen=0;
10832
a8d999c7bb83 plen=0 is handled
alex
parents: 10622
diff changeset
199 //plen==0 is handled later
a8d999c7bb83 plen=0 is handled
alex
parents: 10622
diff changeset
200 //mp_msg(MSGT_DEMUX,MSGL_V,"Invalid plen type! assuming plen=0\n");
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
201 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
202
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
203 // Read sequence:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
204 switch((flags>>1)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
205 case 3: sequence=LOAD_LE32(p);p+=4;break; // dword
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
206 case 2: sequence=LOAD_LE16(p);p+=2;break; // word
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
207 case 1: sequence=p[0];p++;break; // byte
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
208 default: sequence=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
209 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
210
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
211 // Read padding size (padding):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
212 switch((flags>>3)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
213 case 3: padding=LOAD_LE32(p);p+=4;break; // dword
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
214 case 2: padding=LOAD_LE16(p);p+=2;break; // word
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
215 case 1: padding=p[0];p++;break; // byte
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
216 default: padding=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
217 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
218
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
219 if(((flags>>5)&3)!=0){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 // Explicit (absoulte) packet size
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
221 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Explicit packet size specified: %d \n",plen);
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
222 if(plen>asf_packetsize) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! plen>packetsize! (%d>%d) \n",plen,asf_packetsize);
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
223 } else {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 // Padding (relative) size
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
225 plen=asf_packetsize-padding;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
226 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
228 // Read time & duration:
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
229 time = LOAD_LE32(p); p+=4;
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
230 duration = LOAD_LE16(p); p+=2;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
231
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
232 // Read payload flags:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 if(flags&1){
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
234 // multiple sub-packets
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
235 segsizetype=p[0]>>6;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 segs=p[0] & 0x3F;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 ++p;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 }
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
239 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"%08X: flag=%02X segs=%d seq=%d plen=%d pad=%d time=%ld dur=%d\n",
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
240 demux->filepos,flags,segs,sequence,plen,padding,time,duration);
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
241
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 for(seg=0;seg<segs;seg++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 //ASF_segmhdr_t* sh;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244 unsigned char streamno;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
245 unsigned int seq;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
246 unsigned int x; // offset or timestamp
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
247 unsigned int rlen;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
248 //
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 int len;
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7472
diff changeset
250 unsigned int time2=0;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
251 int keyframe=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
253 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
254
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
255 if(verbose>1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 printf("seg %d:",seg);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
258 for(i=0;i<16;i++) printf(" %02X",p[i]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
259 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
260 }
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
261
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 streamno=p[0]&0x7F;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
263 if(p[0]&0x80) keyframe=1;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
264 p++;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
265
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
266 // Read media object number (seq):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
267 switch((segtype>>4)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
268 case 3: seq=LOAD_LE32(p);p+=4;break; // dword
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
269 case 2: seq=LOAD_LE16(p);p+=2;break; // word
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
270 case 1: seq=p[0];p++;break; // byte
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
271 default: seq=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
272 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
273
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
274 // Read offset or timestamp:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
275 switch((segtype>>2)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
276 case 3: x=LOAD_LE32(p);p+=4;break; // dword
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
277 case 2: x=LOAD_LE16(p);p+=2;break; // word
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
278 case 1: x=p[0];p++;break; // byte
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
279 default: x=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
280 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
281
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
282 // Read replic.data len:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
283 switch((segtype)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
284 case 3: rlen=LOAD_LE32(p);p+=4;break; // dword
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
285 case 2: rlen=LOAD_LE16(p);p+=2;break; // word
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
286 case 1: rlen=p[0];p++;break; // byte
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
287 default: rlen=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
288 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
289
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
290 // printf("### rlen=%d \n",rlen);
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
291
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
292 switch(rlen){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
293 case 0x01: // 1 = special, means grouping
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
294 //printf("grouping: %02X \n",p[0]);
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
295 ++p; // skip PTS delta
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
296 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
297 default:
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
298 if(rlen>=8){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
299 p+=4; // skip object size
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
300 time2=LOAD_LE32(p); // read PTS
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
301 p+=rlen-4;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
302 } else {
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
303 mp_msg(MSGT_DEMUX,MSGL_V,"unknown segment type (rlen): 0x%02X \n",rlen);
7472
c4434bdf6e51 tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents: 6668
diff changeset
304 time2=0; // unknown
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
305 p+=rlen;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
306 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
307 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
308
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
309 if(flags&1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
310 // multiple segments
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
311 switch(segsizetype){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
312 case 3: len=LOAD_LE32(p);p+=4;break; // dword
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
313 case 2: len=LOAD_LE16(p);p+=2;break; // word
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
314 case 1: len=p[0];p++;break; // byte
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
315 default: len=plen-(p-asf_packet); // ???
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
316 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
317 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
318 // single segment
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
319 len=plen-(p-asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
320 }
4197
374f2cc73d0d fixed a few possible bugs
arpi
parents: 3475
diff changeset
321 if(len<0 || (p+len)>p_end){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
322 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! segment len=%d\n",len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323 }
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
324 mp_dbg(MSGT_DEMUX,MSGL_DBG4," seg #%d: streamno=%d seq=%d type=%02X len=%d\n",seg,streamno,seq,rlen,len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
326 switch(rlen){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
327 case 0x01:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
328 // GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 //printf(" total: %d \n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
331 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
332 int len2=p[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
333 p++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 //printf(" group part: %d bytes\n",len2);
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
335 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 p+=len2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337 len-=len2+1;
6668
4e3493443b36 100l - seq++ for grouping
arpi
parents: 6442
diff changeset
338 ++seq;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340 if(len!=0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
341 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! groups total != len\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
342 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 break;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
344 default:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
345 // NO GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 //printf("fragment offset: %d \n",sh->x);
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
347 demux_asf_read_packet(demux,p,len,streamno,seq,time2,duration,x,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348 p+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
349 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
350 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
351
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352 } // for segs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 return 1; // success
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
356 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
357 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
358 }
1466
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 #include "stheader.h"
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
361
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7472
diff changeset
362 extern void resync_audio_stream(sh_audio_t *sh_audio);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7472
diff changeset
363 extern void skip_audio_frame(sh_audio_t *sh_audio);
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7472
diff changeset
364
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
365 static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
366 demux_stream_t *d_audio=demuxer->audio;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
367 demux_stream_t *d_video=demuxer->video;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
368 sh_audio_t *sh_audio=d_audio->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
369 // sh_video_t *sh_video=d_video->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
370
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
371 //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
372 //FIXME: reports good or bad to steve@daviesfam.org please
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
373
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
374 //================= seek in ASF ==========================
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
375 float p_rate=asf_packetrate; // packets / sec
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
376 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
377 (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
378 (rel_seek_secs*p_rate);
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
379 off_t rel_seek_bytes=rel_seek_packs*asf_packetsize;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
380 off_t newpos;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
381 //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
382 // printf("ASF_seek: %d secs -> %d packs -> %d bytes \n",
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
383 // 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
384 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
385 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
386 // printf("\r -- asf: newpos=%d -- \n",newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
387 stream_seek(demuxer->stream,newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
388
13310
c629f7ac9b9f fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents: 12877
diff changeset
389 if (d_video->id >= 0)
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
390 ds_fill_buffer(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
391 if(sh_audio){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
392 ds_fill_buffer(d_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
393 resync_audio_stream(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
394 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
395
13310
c629f7ac9b9f fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents: 12877
diff changeset
396 if (d_video->id < 0)
c629f7ac9b9f fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents: 12877
diff changeset
397 sh_audio->delay = d_audio->pts;
c629f7ac9b9f fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents: 12877
diff changeset
398 else
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
399 while(1){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
400 if(sh_audio && !d_audio->eof){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
401 float a_pts=d_audio->pts;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
402 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
403 // sync audio:
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
404 if (d_video->pts > a_pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
405 skip_audio_frame(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
406 // 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
407 continue;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
408 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
409 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
410 if(d_video->flags&1) break; // found a keyframe!
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
411 if(!ds_fill_buffer(d_video)) break; // skip frame. EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
412 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
413
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
414
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
415 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
416
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
417 static int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 8208
diff changeset
418 /* demux_stream_t *d_audio=demuxer->audio;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
419 demux_stream_t *d_video=demuxer->video;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
420 sh_audio_t *sh_audio=d_audio->sh;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
421 sh_video_t *sh_video=d_video->sh;
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 8208
diff changeset
422 */
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
423 switch(cmd) {
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
424 case DEMUXER_CTRL_GET_TIME_LENGTH:
16346
6ff303d2876b Make -identify's 'ID_LENGTH=' print a float and not an integer.. The
ods15
parents: 16175
diff changeset
425 *((double *)arg)=(double)(asf_movielength);
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
426 return DEMUXER_CTRL_OK;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
427
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
428 case DEMUXER_CTRL_GET_PERCENT_POS:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
429 return DEMUXER_CTRL_DONTKNOW;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
430
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
431 default:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
432 return DEMUXER_CTRL_NOTIMPL;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
433 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
434 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
435
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
436
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
437 static demuxer_t* demux_open_asf(demuxer_t* demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
438 {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
439 sh_audio_t *sh_audio=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
440 sh_video_t *sh_video=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
441
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
442 //---- ASF header:
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
443 read_asf_header(demuxer);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
444 stream_reset(demuxer->stream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
445 stream_seek(demuxer->stream,demuxer->movi_start);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
446 // demuxer->idx_pos=0;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
447 // demuxer->endpos=avi_header.movi_end;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
448 if(demuxer->video->id != -2) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
449 if(!ds_fill_buffer(demuxer->video)){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
450 mp_msg(MSGT_DEMUXER,MSGL_WARN,"ASF: " MSGTR_MissingVideoStream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
451 demuxer->video->sh=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
452 //printf("ASF: missing video stream!? contact the author, it may be a bug :(\n");
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
453 } else {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
454 sh_video=demuxer->video->sh;sh_video->ds=demuxer->video;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
455 sh_video->fps=1000.0f; sh_video->frametime=0.001f; // 1ms
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
456 //sh_video->i_bps=10*asf_packetsize; // FIXME!
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
457 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
458 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
459
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
460 if(demuxer->audio->id!=-2){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
461 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_ASFSearchingForAudioStream,demuxer->audio->id);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
462 if(!ds_fill_buffer(demuxer->audio)){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
463 mp_msg(MSGT_DEMUXER,MSGL_INFO,"ASF: " MSGTR_MissingAudioStream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
464 demuxer->audio->sh=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
465 } else {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
466 sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
467 sh_audio->format=sh_audio->wf->wFormatTag;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
468 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
469 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
470
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
471 return demuxer;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
472 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
473
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
474
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
475 demuxer_desc_t demuxer_desc_asf = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
476 "ASF demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
477 "asv",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
478 "ASF",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
479 "A'rpi",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
480 "ASF, WMV, WMA",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
481 DEMUXER_TYPE_ASF,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
482 1, // safe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
483 asf_check_header,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
484 demux_asf_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
485 demux_open_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
486 NULL, //demux_close_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
487 demux_seek_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
488 demux_asf_control
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
489 };