annotate libmpdemux/demux_asf.c @ 26096:e6a565ec1a3b

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