annotate libmpdemux/demux_asf.c @ 24542:a36693ffbb17

it is no longer necessary to reboot the system after the dhahelperwin installation (based on code by Romain Lievin from the tilp project)
author faust3
date Mon, 17 Sep 2007 21:53:16 +0000
parents 5c980247db1f
children 81a77832f5fc
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
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 21968
diff changeset
11 #include "stream/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
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16877
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))
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
24 #define LOAD_BE32(p) (((unsigned char*)(p))[3] | \
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
25 ((unsigned char*)(p))[2]<< 8 | \
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
26 ((unsigned char*)(p))[1]<<16 | \
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
27 ((unsigned char*)(p))[0]<<24 )
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
28 #else
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
29 #define LOAD_LE32(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 ((unsigned char*)(p))[2]<<16 | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
32 ((unsigned char*)(p))[3]<<24 )
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
33 #define LOAD_LE16(p) (((unsigned char*)(p))[0] | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
34 ((unsigned char*)(p))[1]<<8)
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
35 #define LOAD_BE32(p) (*(unsigned int*)(p))
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
36 #endif
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
37
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
38 // defined at asfheader.c:
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
39
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
40 extern int asf_check_header(demuxer_t *demuxer);
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
41 extern int read_asf_header(demuxer_t *demuxer,struct asf_priv* asf);
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
42
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
43 // based on asf file-format doc by Eugene [http://divx.euro.ru]
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
44
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
45 static void asf_descrambling(unsigned char **src,unsigned len, struct asf_priv* asf){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
46 unsigned char *dst=malloc(len);
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
47 unsigned char *s2=*src;
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
48 unsigned i=0,x,y;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
49 while(len>=asf->scrambling_h*asf->scrambling_w*asf->scrambling_b+i){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
50 // 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
51 //i+=asf_scrambling_h*asf_scrambling_w;
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
52 for(x=0;x<asf->scrambling_w;x++)
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
53 for(y=0;y<asf->scrambling_h;y++){
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23357
diff changeset
54 fast_memcpy(dst+i,s2+(y*asf->scrambling_w+x)*asf->scrambling_b,asf->scrambling_b);
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
55 i+=asf->scrambling_b;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
56 }
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
57 s2+=asf->scrambling_h*asf->scrambling_w*asf->scrambling_b;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
58 }
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23357
diff changeset
59 //if(i<len) fast_memcpy(dst+i,src+i,len-i);
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
60 free(*src);
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
61 *src = dst;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
62 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
63
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
64 /*****************************************************************
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
65 * \brief initializes asf private data
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
66 *
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
67 */
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
68 static void init_priv (struct asf_priv* asf){
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
69 asf->last_vid_seq=-1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
70 asf->vid_ext_timing_index=-1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
71 asf->aud_ext_timing_index=-1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
72 asf->vid_ext_frame_index=-1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
73 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
74
17343
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
75 #ifdef USE_LIBAVCODEC_SO
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
76 #include <ffmpeg/avcodec.h>
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
77 #elif defined(USE_LIBAVCODEC)
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
78 #include "libavcodec/avcodec.h"
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
79 #else
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
80 #define FF_INPUT_BUFFER_PADDING_SIZE 8
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
81 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
82
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
83
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
84 static void demux_asf_append_to_packet(demux_packet_t* dp,unsigned char *data,int len,int offs)
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
85 {
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
86 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);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
87 dp->buffer=realloc(dp->buffer,dp->len+len+FF_INPUT_BUFFER_PADDING_SIZE);
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23357
diff changeset
88 fast_memcpy(dp->buffer+dp->len,data,len);
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
89 memset(dp->buffer+dp->len+len, 0, FF_INPUT_BUFFER_PADDING_SIZE);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
90 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"data appended! %d+%d\n",dp->len,len);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
91 dp->len+=len;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
92 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
93
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
94 static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,uint64_t time,unsigned short dur,int offs,int keyframe){
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
95 struct asf_priv* asf = demux->priv;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
96 demux_stream_t *ds=NULL;
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
97 int close_seg=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
98
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
99 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
100
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
101 if(demux->video->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
102 if(demux->v_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
103 demux->video->id=id;
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
104
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
105 if(demux->audio->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
106 if(demux->a_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
107 demux->audio->id=id;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
108
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
109 if(id==demux->audio->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
110 // audio
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
111 ds=demux->audio;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
112 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
113 ds->sh=demux->a_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
114 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
115 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
116 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
117 if(id==demux->video->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
118 // video
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
119 ds=demux->video;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
120 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
121 ds->sh=demux->v_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
122 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
123 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
124 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
125
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
126 if(ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
127 if(ds->asf_packet){
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
128 demux_packet_t* dp=ds->asf_packet;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
129
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
130 if (ds==demux->video && asf->asf_is_dvr_ms) {
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
131 if (asf->new_vid_frame_seg) {
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
132 dp->pos=demux->filepos;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
133 close_seg = 1;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
134 } else seq = ds->asf_seq;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
135 } else close_seg = ds->asf_seq!=seq;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
136
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
137 if(close_seg){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
138 // closed segment, finalize packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
139 if(ds==demux->audio)
18001
a2683ee7cb5a fix descrambling of asf file,
iive
parents: 17992
diff changeset
140 if(asf->scrambling_h>1 && asf->scrambling_w>1 && asf->scrambling_b>0)
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
141 asf_descrambling(&ds->asf_packet->buffer,ds->asf_packet->len,asf);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
142 ds_add_packet(ds,ds->asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
143 ds->asf_packet=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
144 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
145 // append data to it!
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
146 demux_asf_append_to_packet(dp,data,len,offs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
147 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
148 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
149 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
150 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
151 // create new packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
152 { demux_packet_t* dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
153 if(offs>0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
154 mp_msg(MSGT_DEMUX,MSGL_V,"warning! broken fragment, %d bytes missing \n",offs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
155 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
156 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157 dp=new_demux_packet(len);
23457
a124f3abc1ec Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents: 23357
diff changeset
158 fast_memcpy(dp->buffer,data,len);
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
159 if (asf->asf_is_dvr_ms)
23469
d8d1c85dc180 Calculate pts with double precision in demux_asf
uau
parents: 23457
diff changeset
160 dp->pts=time*0.0000001;
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
161 else
23469
d8d1c85dc180 Calculate pts with double precision in demux_asf
uau
parents: 23457
diff changeset
162 dp->pts=time*0.001;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
163 dp->flags=keyframe;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 // if(ds==demux->video) printf("ASF time: %8d dur: %5d \n",time,dur);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
165 dp->pos=demux->filepos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
166 ds->asf_packet=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167 ds->asf_seq=seq;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 }
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 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
174 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
176 /*****************************************************************
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
177 * \brief read the replicated data associated with each segment
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
178 * \parameter pp reference to replicated data
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
179 * \parameter id stream number
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
180 * \parameter seq media object number
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
181 * \parameter keyframe key frame indicator - set to zero if keyframe, non-zero otherwise
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
182 * \parameter seg_time set to payload time when valid, if audio or new video frame payload, zero otherwise
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
183 *
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
184 */
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
185 static void get_payload_extension_data(demuxer_t *demux, unsigned char** pp, unsigned char id, unsigned int seq, int *keyframe, uint64_t *seg_time){
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
186 struct asf_priv* asf = demux->priv;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
187 uint64_t payload_time; //100ns units
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
188 int i, ext_max, ext_timing_index;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
189 uint8_t *pi = *pp+4;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
190
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
191 if(demux->video->id==-1)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
192 if(demux->v_streams[id])
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
193 demux->video->id=id;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
194
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
195 if(demux->audio->id==-1)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
196 if(demux->a_streams[id])
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
197 demux->audio->id=id;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
198
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
199 if (id!=demux->video->id && id!=demux->audio->id) return;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
200
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
201 if (id==demux->video->id) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
202 ext_max = asf->vid_repdata_count;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
203 ext_timing_index = asf->vid_ext_timing_index;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
204 } else {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
205 ext_max = asf->aud_repdata_count;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
206 ext_timing_index = asf->aud_ext_timing_index;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
207 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
208
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
209 *seg_time=0.0;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
210 asf->new_vid_frame_seg = 0;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
211
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
212 for (i=0; i<ext_max; i++) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
213 uint16_t payextsize;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
214 uint8_t segment_marker;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
215
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
216 if (id==demux->video->id)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
217 payextsize = asf->vid_repdata_sizes[i];
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
218 else
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
219 payextsize = asf->aud_repdata_sizes[i];
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
220
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
221 if (payextsize == 65535) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
222 payextsize = LOAD_LE16(pi);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
223 pi+=2;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
224 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
225
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
226 // if this is the timing info extension then read the payload time
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
227 if (i == ext_timing_index)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
228 payload_time = (uint64_t) LOAD_LE32(pi+8) | (uint64_t)LOAD_LE32(pi+8 + 4) << 32;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
229
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
230 // if this is the video frame info extension then
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
231 // set the keyframe indicator, the 'new frame segment' indicator
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
232 // and (initially) the 'frame time'
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
233 if (i == asf->vid_ext_frame_index && id==demux->video->id) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
234 segment_marker = pi[0];
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
235 // Known video stream segment_marker values that
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
236 // contain useful information:
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
237 //
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
238 // NTSC/ATSC (29.97fps): 0X4A 01001010
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
239 // 0X4B 01001011
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
240 // 0X49 01001001
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
241 //
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
242 // PAL/ATSC (25fps): 0X3A 00111010
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
243 // 0X3B 00111011
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
244 // 0X39 00111001
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
245 //
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
246 // ATSC progressive (29.97fps): 0X7A 01111010
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
247 // 0X7B 01111011
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
248 // 0X79 01111001
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
249 // 11111111
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
250 // ^ this is new video frame marker
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
251 //
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
252 // ^^^^ these bits indicate the framerate
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
253 // 0X4 is 29.97i, 0X3 is 25i, 0X7 is 29.97p, ???=25p
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
254 //
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
255 // ^^^ these bits indicate the frame type:
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
256 // 001 means I-frame
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
257 // 010 and 011 probably mean P and B
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
258
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
259 asf->new_vid_frame_seg = (0X08 & segment_marker) && seq != asf->last_vid_seq;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
260
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
261 if (asf->new_vid_frame_seg) asf->last_vid_seq = seq;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
262
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
263 if (asf->avg_vid_frame_time == 0) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
264 // set the average frame time initially (in 100ns units).
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
265 // This is based on what works for known samples.
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
266 // It can be extended if more samples of different types can be obtained.
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
267 if (((segment_marker & 0XF0) >> 4) == 4) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
268 asf->avg_vid_frame_time = (uint64_t)((1.001 / 30.0) * 10000000.0);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
269 asf->know_frame_time=1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
270 } else if (((segment_marker & 0XF0) >> 4) == 3) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
271 asf->avg_vid_frame_time = (uint64_t)(0.04 * 10000000.0);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
272 asf->know_frame_time=1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
273 } else if (((segment_marker & 0XF0) >> 4) == 6) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
274 asf->avg_vid_frame_time = (uint64_t)(0.02 * 10000000.0);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
275 asf->know_frame_time=1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
276 } else if (((segment_marker & 0XF0) >> 4) == 7) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
277 asf->avg_vid_frame_time = (uint64_t)((1.001 / 60.0) * 10000000.0);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
278 asf->know_frame_time=1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
279 } else {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
280 // we dont know the frame time initially so
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
281 // make a guess and then recalculate as we go.
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
282 asf->avg_vid_frame_time = (uint64_t)((1.001 / 60.0) * 10000000.0);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
283 asf->know_frame_time=0;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
284 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
285 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
286 *keyframe = (asf->new_vid_frame_seg && (segment_marker & 0X07) == 1);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
287 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
288 pi +=payextsize;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
289 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
290
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
291 if (id==demux->video->id && asf->new_vid_frame_seg) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
292 asf->vid_frame_ct++;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
293 // Some samples only have timings on key frames and
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
294 // the rest contain non-cronological timestamps. Interpolating
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
295 // the values between key frames works for all samples.
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
296 if (*keyframe) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
297 asf->found_first_key_frame=1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
298 if (!asf->know_frame_time && asf->last_key_payload_time > 0) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
299 // We dont know average frametime so recalculate.
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
300 // Giving precedence to the 'weight' of the existing
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
301 // average limits damage done to new value when there is
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
302 // a sudden time jump which happens occasionally.
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
303 asf->avg_vid_frame_time =
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
304 (0.9 * asf->avg_vid_frame_time) +
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
305 (0.1 * ((payload_time - asf->last_key_payload_time) / asf->vid_frame_ct));
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
306 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
307 asf->last_key_payload_time = payload_time;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
308 asf->vid_frame_ct = 1;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
309 *seg_time = payload_time;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
310 } else
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
311 *seg_time = (asf->last_key_payload_time + (asf->avg_vid_frame_time * (asf->vid_frame_ct-1)));
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
312 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
313
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
314 if (id==demux->audio->id) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
315 if (payload_time != -1)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
316 asf->last_aud_diff = payload_time - asf->last_aud_pts;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
317 asf->last_aud_pts += asf->last_aud_diff;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
318 *seg_time = asf->last_aud_pts;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
319 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
320 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
321 //static int num_elementary_packets100=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
322 //static int num_elementary_packets101=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
323
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
324 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
325 // 0 = EOF or no stream found
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
326 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
327 static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
328 struct asf_priv* asf = demux->priv;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
329
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 demux->filepos=stream_tell(demux->stream);
3475
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
331 // Brodcast stream have movi_start==movi_end
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
332 // Better test ?
10622
085c10cf912c fixes http://pot.lsd.ro/video.asf
arpi
parents: 8254
diff changeset
333 if((demux->movi_start < demux->movi_end) && (demux->filepos>=demux->movi_end)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 demux->stream->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
335 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
336 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
338 stream_read(demux->stream,asf->packet,asf->packetsize);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
339 if(demux->stream->eof) return 0; // EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
340
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
341 {
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
342 unsigned char* p=asf->packet;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
343 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
344 unsigned char flags=p[0];
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
345 unsigned char segtype=p[1];
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
346 unsigned padding;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
347 unsigned plen;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
348 unsigned sequence;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
349 unsigned long time=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
350 unsigned short duration=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
351
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352 int segs=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 unsigned char segsizetype=0x80;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
354 int seg=-1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
355
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17636
diff changeset
356 if( mp_msg_test(MSGT_DEMUX,MSGL_DBG2) ){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
357 int i;
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
358 for(i=0;i<16;i++) printf(" %02X",asf->packet[i]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
360 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
361
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
362 // 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
363 // 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
364 // 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
365 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
366 {
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
367 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
368 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
369 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
370 }
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
371
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
372 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
373
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
374 p+=2; // skip flags & segtype
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
375
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
376 // Read packet size (plen):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
377 switch((flags>>5)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
378 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
379 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
380 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
381 default: plen=0;
10832
a8d999c7bb83 plen=0 is handled
alex
parents: 10622
diff changeset
382 //plen==0 is handled later
a8d999c7bb83 plen=0 is handled
alex
parents: 10622
diff changeset
383 //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
384 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
385
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
386 // Read sequence:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
387 switch((flags>>1)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
388 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
389 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
390 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
391 default: sequence=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
392 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
393
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
394 // Read padding size (padding):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
395 switch((flags>>3)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
396 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
397 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
398 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
399 default: padding=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
400 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
401
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
402 if(((flags>>5)&3)!=0){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
403 // Explicit (absoulte) packet size
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
404 mp_dbg(MSGT_DEMUX,MSGL_DBG2,"Explicit packet size specified: %d \n",plen);
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
405 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
406 } else {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
407 // Padding (relative) size
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
408 plen=asf->packetsize-padding;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
409 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
410
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
411 // Read time & duration:
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
412 time = LOAD_LE32(p); p+=4;
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
413 duration = LOAD_LE16(p); p+=2;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
414
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
415 // Read payload flags:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
416 if(flags&1){
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
417 // multiple sub-packets
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
418 segsizetype=p[0]>>6;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 segs=p[0] & 0x3F;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420 ++p;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
421 }
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
422 mp_dbg(MSGT_DEMUX,MSGL_DBG4,"%08"PRIu64": flag=%02X segs=%d seq=%u plen=%u pad=%u time=%ld dur=%d\n",
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
423 (uint64_t)demux->filepos,flags,segs,sequence,plen,padding,time,duration);
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
424
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
425 for(seg=0;seg<segs;seg++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
426 //ASF_segmhdr_t* sh;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
427 unsigned char streamno;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
428 unsigned int seq;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
429 unsigned int x; // offset or timestamp
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
430 unsigned int rlen;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
431 //
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
432 int len;
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
433 uint64_t time2=0;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
434 int keyframe=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
435
21968
92f83f7c8eef Instead of printing a useless "sig11 coming soon" message, just abort parsing
reimar
parents: 20792
diff changeset
436 if(p>=p_end) {
92f83f7c8eef Instead of printing a useless "sig11 coming soon" message, just abort parsing
reimar
parents: 20792
diff changeset
437 mp_msg(MSGT_DEMUX,MSGL_V,"Warning! invalid packet 1, aborting parsing...\n");
92f83f7c8eef Instead of printing a useless "sig11 coming soon" message, just abort parsing
reimar
parents: 20792
diff changeset
438 break;
92f83f7c8eef Instead of printing a useless "sig11 coming soon" message, just abort parsing
reimar
parents: 20792
diff changeset
439 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17636
diff changeset
441 if( mp_msg_test(MSGT_DEMUX,MSGL_DBG2) ){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 printf("seg %d:",seg);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
444 for(i=0;i<16;i++) printf(" %02X",p[i]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
445 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
446 }
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
447
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
448 streamno=p[0]&0x7F;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
449 if(p[0]&0x80) keyframe=1;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
450 p++;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
451
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
452 // Read media object number (seq):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
453 switch((segtype>>4)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
454 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
455 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
456 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
457 default: seq=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
458 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
459
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
460 // Read offset or timestamp:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
461 switch((segtype>>2)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
462 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
463 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
464 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
465 default: x=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
466 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
467
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
468 // Read replic.data len:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
469 switch((segtype)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
470 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
471 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
472 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
473 default: rlen=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
474 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
475
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
476 // printf("### rlen=%d \n",rlen);
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
477
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
478 switch(rlen){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
479 case 0x01: // 1 = special, means grouping
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
480 //printf("grouping: %02X \n",p[0]);
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
481 ++p; // skip PTS delta
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
482 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
483 default:
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
484 if(rlen>=8){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
485 p+=4; // skip object size
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
486 time2=LOAD_LE32(p); // read PTS
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
487 if (asf->asf_is_dvr_ms)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
488 get_payload_extension_data(demux, &p, streamno, seq, &keyframe, &time2);
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
489 p+=rlen-4;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
490 } else {
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
491 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
492 time2=0; // unknown
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
493 p+=rlen;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
494 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
495 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
496
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
497 if(flags&1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
498 // multiple segments
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
499 switch(segsizetype){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
500 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
501 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
502 case 1: len=p[0];p++;break; // byte
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
503 default: len=plen-(p-asf->packet); // ???
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
504 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
505 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
506 // single segment
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
507 len=plen-(p-asf->packet);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
508 }
4197
374f2cc73d0d fixed a few possible bugs
arpi
parents: 3475
diff changeset
509 if(len<0 || (p+len)>p_end){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
510 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! segment len=%d\n",len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
511 }
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
512 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
513
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
514 switch(rlen){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
515 case 0x01:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
516 // GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
517 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
518 //printf(" total: %d \n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
519 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
520 int len2=p[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
521 p++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
522 //printf(" group part: %d bytes\n",len2);
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
523 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
524 p+=len2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
525 len-=len2+1;
6668
4e3493443b36 100l - seq++ for grouping
arpi
parents: 6442
diff changeset
526 ++seq;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
527 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
528 if(len!=0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
529 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! groups total != len\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
530 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
531 break;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
532 default:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
533 // NO GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
534 //printf("fragment offset: %d \n",sh->x);
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
535 if (!asf->asf_is_dvr_ms || asf->found_first_key_frame)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
536 demux_asf_read_packet(demux,p,len,streamno,seq,time2,duration,x,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
537 p+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
538 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
539 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
540
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
541 } // for segs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
542 return 1; // success
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
543 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
544
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
545 mp_msg(MSGT_DEMUX,MSGL_V,"%08"PRIX64": UNKNOWN TYPE %02X %02X %02X %02X %02X...\n",(int64_t)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
546 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
547 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
548
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
549 #include "stheader.h"
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
550
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7472
diff changeset
551 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
552
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17598
diff changeset
553 static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
554 struct asf_priv* asf = demuxer->priv;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
555 demux_stream_t *d_audio=demuxer->audio;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
556 demux_stream_t *d_video=demuxer->video;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
557 sh_audio_t *sh_audio=d_audio->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
558 // sh_video_t *sh_video=d_video->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
559
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
560 //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
561 //FIXME: reports good or bad to steve@daviesfam.org please
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
562
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
563 //================= seek in ASF ==========================
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
564 float p_rate=asf->packetrate; // packets / sec
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
565 off_t rel_seek_packs=(flags&2)? // FIXME: int may be enough?
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
566 (rel_seek_secs*(demuxer->movi_end-demuxer->movi_start)/asf->packetsize):
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
567 (rel_seek_secs*p_rate);
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
568 off_t rel_seek_bytes=rel_seek_packs*asf->packetsize;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
569 off_t newpos;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
570 //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
571 // printf("ASF_seek: %d secs -> %d packs -> %d bytes \n",
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
572 // 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
573 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
574 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
575 // printf("\r -- asf: newpos=%d -- \n",newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
576 stream_seek(demuxer->stream,newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
577
19961
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
578 if (asf->asf_is_dvr_ms) asf->dvr_last_vid_pts = 0.0f;
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
579
13310
c629f7ac9b9f fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents: 12877
diff changeset
580 if (d_video->id >= 0)
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
581 ds_fill_buffer(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
582 if(sh_audio){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
583 ds_fill_buffer(d_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
584 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
585
18710
c528c6c518f1 Clean up audio pts handling, make audio pts tracking in the audio-only
uau
parents: 18609
diff changeset
586 if (d_video->id >= 0)
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
587 while(1){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
588 if(sh_audio && !d_audio->eof){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
589 float a_pts=d_audio->pts;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
590 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
591 // sync audio:
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
592 if (d_video->pts > a_pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
593 skip_audio_frame(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
594 // 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
595 continue;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
596 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
597 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
598 if(d_video->flags&1) break; // found a keyframe!
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
599 if(!ds_fill_buffer(d_video)) break; // skip frame. EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
600 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
601
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
602
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
603 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
604
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
605 static int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
606 struct asf_priv* asf = demuxer->priv;
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 8208
diff changeset
607 /* demux_stream_t *d_audio=demuxer->audio;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
608 demux_stream_t *d_video=demuxer->video;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
609 sh_audio_t *sh_audio=d_audio->sh;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
610 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
611 */
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
612 switch(cmd) {
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
613 case DEMUXER_CTRL_GET_TIME_LENGTH:
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
614 *((double *)arg)=(double)(asf->movielength);
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
615 return DEMUXER_CTRL_OK;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
616
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
617 case DEMUXER_CTRL_GET_PERCENT_POS:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
618 return DEMUXER_CTRL_DONTKNOW;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
619
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
620 default:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
621 return DEMUXER_CTRL_NOTIMPL;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
622 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
623 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
624
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
625
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
626 static demuxer_t* demux_open_asf(demuxer_t* demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
627 {
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
628 struct asf_priv* asf = demuxer->priv;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
629 sh_audio_t *sh_audio=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
630 sh_video_t *sh_video=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
631
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
632 //---- ASF header:
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
633 if(!asf) return NULL;
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
634 init_priv(asf);
23295
ab885f928444 Fix double free() in demux_asf.c
uau
parents: 23239
diff changeset
635 if (!read_asf_header(demuxer,asf))
17598
4b8193d51bda we cannot continue without a crash when read_asf_header fails, since some
reimar
parents: 17569
diff changeset
636 return NULL;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
637 stream_reset(demuxer->stream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
638 stream_seek(demuxer->stream,demuxer->movi_start);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
639 // demuxer->idx_pos=0;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
640 // demuxer->endpos=avi_header.movi_end;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
641 if(demuxer->video->id != -2) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
642 if(!ds_fill_buffer(demuxer->video)){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
643 mp_msg(MSGT_DEMUXER,MSGL_WARN,"ASF: " MSGTR_MissingVideoStream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
644 demuxer->video->sh=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
645 //printf("ASF: missing video stream!? contact the author, it may be a bug :(\n");
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
646 } else {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
647 sh_video=demuxer->video->sh;sh_video->ds=demuxer->video;
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
648 sh_video->fps=1000.0f; sh_video->frametime=0.001f;
20636
325db3f2aba3 don't set the resolution for dvr-ms files: in the asf headers it seems to
nicodvb
parents: 19961
diff changeset
649
325db3f2aba3 don't set the resolution for dvr-ms files: in the asf headers it seems to
nicodvb
parents: 19961
diff changeset
650 if (asf->asf_is_dvr_ms) {
325db3f2aba3 don't set the resolution for dvr-ms files: in the asf headers it seems to
nicodvb
parents: 19961
diff changeset
651 sh_video->bih->biWidth = 0;
325db3f2aba3 don't set the resolution for dvr-ms files: in the asf headers it seems to
nicodvb
parents: 19961
diff changeset
652 sh_video->bih->biHeight = 0;
325db3f2aba3 don't set the resolution for dvr-ms files: in the asf headers it seems to
nicodvb
parents: 19961
diff changeset
653 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
654 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
655 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
656
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
657 if(demuxer->audio->id!=-2){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
658 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_ASFSearchingForAudioStream,demuxer->audio->id);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
659 if(!ds_fill_buffer(demuxer->audio)){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
660 mp_msg(MSGT_DEMUXER,MSGL_INFO,"ASF: " MSGTR_MissingAudioStream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
661 demuxer->audio->sh=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
662 } else {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
663 sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
664 sh_audio->format=sh_audio->wf->wFormatTag;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
665 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
666 }
20792
dcaf8b9f47e9 Fix crash when attempting to seek in a streamed unseekable stream, like
gpoirier
parents: 20636
diff changeset
667 if(!demuxer->stream->seek)
dcaf8b9f47e9 Fix crash when attempting to seek in a streamed unseekable stream, like
gpoirier
parents: 20636
diff changeset
668 demuxer->seekable=0;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
669
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
670 return demuxer;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
671 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
672
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
673
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
674 static void demux_close_asf(demuxer_t *demuxer) {
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
675 struct asf_priv* asf = demuxer->priv;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
676
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
677 if (!asf) return;
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
678
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
679 if (asf->aud_repdata_sizes)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
680 free(asf->aud_repdata_sizes);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
681
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
682 if (asf->vid_repdata_sizes)
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
683 free(asf->vid_repdata_sizes);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
684
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
685 free(asf);
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
686 }
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
687
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
688 demuxer_desc_t demuxer_desc_asf = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
689 "ASF demuxer",
17232
d318e2ff799e Typo in ASF demuxer selection by name (it's 'asf', not 'asv')
rtognimp
parents: 17226
diff changeset
690 "asf",
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
691 "ASF",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
692 "A'rpi",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
693 "ASF, WMV, WMA",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
694 DEMUXER_TYPE_ASF,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
695 1, // safe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
696 asf_check_header,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
697 demux_asf_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
698 demux_open_asf,
23239
cc01eab9f3a9 For DVR-MS:
nicodvb
parents: 22605
diff changeset
699 demux_close_asf,
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
700 demux_seek_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
701 demux_asf_control
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
702 };