annotate libmpdemux/demux_asf.c @ 21644:f0923677efc3

Trnaslated section "CODEC SPECIFIC ENCODING OPTIONS (MENCODER ONLY)" Now man page translaton is complete. However, translation contains many FIXME issues and needs additional checks.
author voroshil
date Sun, 17 Dec 2006 20:25:06 +0000
parents dcaf8b9f47e9
children 92f83f7c8eef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
1 // ASF file parser for DEMUXER v0.3 by A'rpi/ESP-team
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
2
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
3 #include <stdio.h>
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
4 #include <stdlib.h>
1430
1728d249c783 missing unistd.h (requires for off_t under freebsd)
arpi
parents: 1342
diff changeset
5 #include <unistd.h>
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
6
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
7 #include "config.h"
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
8 #include "mp_msg.h"
1973
5216f108cb4f all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents: 1628
diff changeset
9 #include "help_mp.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
10
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
11 #include "stream.h"
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
12 #include "asf.h"
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
13 #include "demuxer.h"
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
14
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
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
17 #define ASFMIN(a,b) ((a) > (b) ? (b) : (a))
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
18 #define SLICE_MIN_START_CODE 0x00000101
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
19 #define SLICE_MAX_START_CODE 0x000001af
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
20 #define END_NOT_FOUND -100
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
21
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
22 /*
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
23 * Load 16/32-bit values in little endian byte order
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
24 * from an unaligned address
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
25 */
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
26 #ifdef ARCH_X86
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
27 #define LOAD_LE32(p) (*(unsigned int*)(p))
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
28 #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
29 #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
30 ((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
31 ((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
32 ((unsigned char*)(p))[0]<<24 )
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
33 #else
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
34 #define LOAD_LE32(p) (((unsigned char*)(p))[0] | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
35 ((unsigned char*)(p))[1]<< 8 | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
36 ((unsigned char*)(p))[2]<<16 | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
37 ((unsigned char*)(p))[3]<<24 )
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
38 #define LOAD_LE16(p) (((unsigned char*)(p))[0] | \
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
39 ((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
40 #define LOAD_BE32(p) (*(unsigned int*)(p))
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
41 #endif
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
42
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
43 // 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
44
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
45 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
46 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
47
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
48 // based on asf file-format doc by Eugene [http://divx.euro.ru]
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
49
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
50 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
51 unsigned char *dst=malloc(len);
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
52 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
53 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
54 while(len>=asf->scrambling_h*asf->scrambling_w*asf->scrambling_b+i){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
55 // 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
56 //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
57 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
58 for(y=0;y<asf->scrambling_h;y++){
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
59 memcpy(dst+i,s2+(y*asf->scrambling_w+x)*asf->scrambling_b,asf->scrambling_b);
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
60 i+=asf->scrambling_b;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
61 }
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
62 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
63 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
64 //if(i<len) memcpy(dst+i,src+i,len-i);
15553
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
65 free(*src);
43af13780751 Speedup asf descrambling (avoid one memcpy and use our fastmemcpy).
reimar
parents: 14502
diff changeset
66 *src = dst;
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
67 }
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
68
17343
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
69 #ifdef USE_LIBAVCODEC_SO
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
70 #include <ffmpeg/avcodec.h>
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
71 #elif defined(USE_LIBAVCODEC)
b07bb7ee7ce4 include the right avcodec.h, consistently with the rest of mplayer
nicodvb
parents: 17232
diff changeset
72 #include "libavcodec/avcodec.h"
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
73 #else
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
74 #define FF_INPUT_BUFFER_PADDING_SIZE 8
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 17012
diff changeset
75 #endif
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
76
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
77 static const uint8_t *find_start_code(const uint8_t * restrict p, const uint8_t *end, uint32_t * restrict state){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
78 int i;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
79 if(p>=end)
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
80 return end;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
81
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
82 for(i=0; i<3; i++){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
83 uint32_t tmp= *state << 8;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
84 *state= tmp + *(p++);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
85 if(tmp == 0x100 || p==end)
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
86 return p;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
87 }
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 while(p<end){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
90 if (p[-1] > 1 ) p+= 3;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
91 else if(p[-2] ) p+= 2;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
92 else if(p[-3]|(p[-1]-1)) p++;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
93 else{
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
94 p++;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
95 break;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
96 }
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
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
99 p= ASFMIN(p, end)-4;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
100 *state= LOAD_BE32(p);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
101
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
102 return p+4;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
103 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
104
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
105 static int mpeg1_find_frame_end(demuxer_t *demux, const uint8_t *buf, int buf_size)
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
106 {
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
107 int i;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
108 struct asf_priv* asf = demux->priv;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
109
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
110 i=0;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
111 if(!asf->asf_frame_start_found){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
112 for(i=0; i<buf_size; i++){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
113 i= find_start_code(buf+i, buf+buf_size, &asf->asf_frame_state) - buf - 1;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
114 if(asf->asf_frame_state >= SLICE_MIN_START_CODE && asf->asf_frame_state <= SLICE_MAX_START_CODE){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
115 i++;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
116 asf->asf_frame_start_found=1;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
117 break;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
118 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
119 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
120 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
121
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
122 if(asf->asf_frame_start_found){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
123 /* EOF considered as end of frame */
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
124 if (buf_size == 0)
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
125 return 0;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
126
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
127 for(; i<buf_size; i++){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
128 i= find_start_code(buf+i, buf+buf_size, &asf->asf_frame_state) - buf - 1;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
129 if((asf->asf_frame_state&0xFFFFFF00) == 0x100){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
130 //if NOT in range 257 - 431
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
131 if(asf->asf_frame_state < SLICE_MIN_START_CODE || asf->asf_frame_state > SLICE_MAX_START_CODE){
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
132 asf->asf_frame_start_found=0;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
133 asf->asf_frame_state=-1;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
134 return i-3;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
135 }
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 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
138 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
139 return END_NOT_FOUND;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
140 }
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 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
143 {
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
144 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
145 dp->buffer=realloc(dp->buffer,dp->len+len+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
146 memcpy(dp->buffer+dp->len,data,len);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
147 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
148 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
149 dp->len+=len;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
150 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
151
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
152 static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,int id,int seq,unsigned long time,unsigned short dur,int offs,int keyframe){
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
153 struct asf_priv* asf = demux->priv;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
154 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
155 int close_seg=0;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
156 int frame_end_pos=END_NOT_FOUND;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
157
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
158 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
159
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
160 if(demux->video->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
161 if(demux->v_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
162 demux->video->id=id;
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
163
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
164 if(demux->audio->id==-1)
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
165 if(demux->a_streams[id])
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
166 demux->audio->id=id;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
167
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
168 if(id==demux->audio->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
169 // audio
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
170 ds=demux->audio;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
171 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
172 ds->sh=demux->a_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
173 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
174 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
175 } else
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
176 if(id==demux->video->id){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
177 // video
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
178 ds=demux->video;
426
26e513f392b2 new stream selection code
arpi_esp
parents: 109
diff changeset
179 if(!ds->sh){
587
8511095c5283 stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents: 426
diff changeset
180 ds->sh=demux->v_streams[id];
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
181 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
182 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
183 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
184
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
185 if(ds){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
186 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
187 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
188
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
189 if (ds==demux->video && asf->asf_is_dvr_ms) {
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
190 frame_end_pos=mpeg1_find_frame_end(demux, data, len);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
191
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
192 if (frame_end_pos != END_NOT_FOUND) {
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
193 dp->pos=demux->filepos;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
194 if (frame_end_pos > 0) {
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
195 demux_asf_append_to_packet(dp,data,frame_end_pos,offs);
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
196 data += frame_end_pos;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
197 len -= frame_end_pos;
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
198 }
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
199 close_seg = 1;
19961
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
200 if (asf->avg_vid_frame_time > 0.0 ) {
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
201 // correct the pts for the packet
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
202 // because dvr-ms files do not contain accurate
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
203 // pts values but we can deduce them using
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
204 // the average frame time
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
205 if (asf->dvr_last_vid_pts > 0.0)
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
206 dp->pts=asf->dvr_last_vid_pts+asf->avg_vid_frame_time;
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
207 asf->dvr_last_vid_pts = dp->pts;
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
208 }
18609
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
209 } 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
210 } 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
211
bb7042d74855 Patch from John Donaghy: "fix for audio and video in dvr-ms asf files"
pacman
parents: 18001
diff changeset
212 if(close_seg){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
213 // closed segment, finalize packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
214 if(ds==demux->audio)
18001
a2683ee7cb5a fix descrambling of asf file,
iive
parents: 17992
diff changeset
215 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
216 asf_descrambling(&ds->asf_packet->buffer,ds->asf_packet->len,asf);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
217 ds_add_packet(ds,ds->asf_packet);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
218 ds->asf_packet=NULL;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
219 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
220 // 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
221 demux_asf_append_to_packet(dp,data,len,offs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
222 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
223 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
224 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
225 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
226 // create new packet:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
227 { demux_packet_t* dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
228 if(offs>0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
229 mp_msg(MSGT_DEMUX,MSGL_V,"warning! broken fragment, %d bytes missing \n",offs);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
230 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
231 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
232 dp=new_demux_packet(len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
233 memcpy(dp->buffer,data,len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
234 dp->pts=time*0.001f;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
235 dp->flags=keyframe;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
236 // if(ds==demux->video) printf("ASF time: %8d dur: %5d \n",time,dur);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
237 dp->pos=demux->filepos;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
238 ds->asf_packet=dp;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
239 ds->asf_seq=seq;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
240 // we are ready now.
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
241 return 1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
242 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
243 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
244
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
245 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
246 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
247
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
248 //static int num_elementary_packets100=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
249 //static int num_elementary_packets101=0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
250
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
251 // return value:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
252 // 0 = EOF or no stream found
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
253 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
254 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
255 struct asf_priv* asf = demux->priv;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
256
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
257 demux->filepos=stream_tell(demux->stream);
3475
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
258 // Brodcast stream have movi_start==movi_end
390388c75209 Applied the patch from Alban Bedel <albeu@free.fr> to
bertrand
parents: 2338
diff changeset
259 // Better test ?
10622
085c10cf912c fixes http://pot.lsd.ro/video.asf
arpi
parents: 8254
diff changeset
260 if((demux->movi_start < demux->movi_end) && (demux->filepos>=demux->movi_end)){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
261 demux->stream->eof=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
262 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
263 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
264
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
265 stream_read(demux->stream,asf->packet,asf->packetsize);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
266 if(demux->stream->eof) return 0; // EOF
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
267
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
268 {
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
269 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
270 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
271 unsigned char flags=p[0];
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
272 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
273 unsigned padding;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
274 unsigned plen;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
275 unsigned sequence;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
276 unsigned long time=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
277 unsigned short duration=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
278
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
279 int segs=1;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
280 unsigned char segsizetype=0x80;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
281 int seg=-1;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
282
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17636
diff changeset
283 if( mp_msg_test(MSGT_DEMUX,MSGL_DBG2) ){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
284 int i;
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
285 for(i=0;i<16;i++) printf(" %02X",asf->packet[i]);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
286 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
287 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
288
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
289 // 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
290 // 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
291 // 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
292 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
293 {
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
294 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
295 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
296 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
297 }
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
298
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
299 //if(segtype!=0x5d) printf("Warning! packet[4] != 0x5d \n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
300
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
301 p+=2; // skip flags & segtype
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
302
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
303 // Read packet size (plen):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
304 switch((flags>>5)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
305 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
306 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
307 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
308 default: plen=0;
10832
a8d999c7bb83 plen=0 is handled
alex
parents: 10622
diff changeset
309 //plen==0 is handled later
a8d999c7bb83 plen=0 is handled
alex
parents: 10622
diff changeset
310 //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
311 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
312
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
313 // Read sequence:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
314 switch((flags>>1)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
315 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
316 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
317 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
318 default: sequence=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
319 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
320
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
321 // Read padding size (padding):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
322 switch((flags>>3)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
323 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
324 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
325 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
326 default: padding=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
327 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
328
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
329 if(((flags>>5)&3)!=0){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
330 // Explicit (absoulte) packet size
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
331 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
332 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
333 } else {
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
334 // Padding (relative) size
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
335 plen=asf->packetsize-padding;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
336 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
337
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
338 // Read time & duration:
1342
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
339 time = LOAD_LE32(p); p+=4;
baf646413408 ASF support for non-x86 cpus
jkeil
parents: 1327
diff changeset
340 duration = LOAD_LE16(p); p+=2;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
341
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
342 // Read payload flags:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
343 if(flags&1){
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
344 // multiple sub-packets
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
345 segsizetype=p[0]>>6;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
346 segs=p[0] & 0x3F;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
347 ++p;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
348 }
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
349 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
350 (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
351
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
352 for(seg=0;seg<segs;seg++){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
353 //ASF_segmhdr_t* sh;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
354 unsigned char streamno;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
355 unsigned int seq;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
356 unsigned int x; // offset or timestamp
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
357 unsigned int rlen;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
358 //
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
359 int len;
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7472
diff changeset
360 unsigned int time2=0;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
361 int keyframe=0;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
362
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
363 if(p>=p_end) mp_msg(MSGT_DEMUX,MSGL_V,"Warning! invalid packet 1, sig11 coming soon...\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
364
17932
3fe3b2b3a6ce Convert all if(verbose>X) to mp_msg_test calls.
diego
parents: 17636
diff changeset
365 if( mp_msg_test(MSGT_DEMUX,MSGL_DBG2) ){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
366 int i;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
367 printf("seg %d:",seg);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
368 for(i=0;i<16;i++) printf(" %02X",p[i]);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
369 printf("\n");
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
370 }
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
371
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
372 streamno=p[0]&0x7F;
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
373 if(p[0]&0x80) keyframe=1;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
374 p++;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
375
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
376 // Read media object number (seq):
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
377 switch((segtype>>4)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
378 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
379 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
380 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
381 default: seq=0;
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
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
384 // Read offset or timestamp:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
385 switch((segtype>>2)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
386 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
387 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
388 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
389 default: x=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
390 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
391
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
392 // Read replic.data len:
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
393 switch((segtype)&3){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
394 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
395 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
396 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
397 default: rlen=0;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
398 }
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
399
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
400 // printf("### rlen=%d \n",rlen);
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 switch(rlen){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
403 case 0x01: // 1 = special, means grouping
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
404 //printf("grouping: %02X \n",p[0]);
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
405 ++p; // skip PTS delta
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
406 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
407 default:
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
408 if(rlen>=8){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
409 p+=4; // skip object size
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
410 time2=LOAD_LE32(p); // read PTS
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
411 p+=rlen-4;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
412 } else {
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
413 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
414 time2=0; // unknown
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
415 p+=rlen;
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
416 }
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
417 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
418
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
419 if(flags&1){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
420 // multiple segments
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
421 switch(segsizetype){
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
422 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
423 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
424 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
425 default: len=plen-(p-asf->packet); // ???
6442
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 } else {
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
428 // single segment
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
429 len=plen-(p-asf->packet);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
430 }
4197
374f2cc73d0d fixed a few possible bugs
arpi
parents: 3475
diff changeset
431 if(len<0 || (p+len)>p_end){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
432 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! segment len=%d\n",len);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
433 }
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
434 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
435
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
436 switch(rlen){
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
437 case 0x01:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
438 // GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
439 //printf("ASF_parser: warning! grouping (flag=1) not yet supported!\n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
440 //printf(" total: %d \n",len);
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
441 while(len>0){
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
442 int len2=p[0];
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
443 p++;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
444 //printf(" group part: %d bytes\n",len2);
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
445 demux_asf_read_packet(demux,p,len2,streamno,seq,x,duration,-1,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
446 p+=len2;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
447 len-=len2+1;
6668
4e3493443b36 100l - seq++ for grouping
arpi
parents: 6442
diff changeset
448 ++seq;
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
449 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
450 if(len!=0){
1567
5c7760aa4f94 printf->mp_msg/mp_dbg
arpi
parents: 1485
diff changeset
451 mp_msg(MSGT_DEMUX,MSGL_V,"ASF_parser: warning! groups total != len\n");
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
452 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
453 break;
6442
2eaeb73ce8ab some cleanup and fixes, but the badquality.asf is still buggy :(
arpi
parents: 4197
diff changeset
454 default:
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
455 // NO GROUPING:
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
456 //printf("fragment offset: %d \n",sh->x);
979
3bcc435cd5a2 keyframe flag added
arpi_esp
parents: 848
diff changeset
457 demux_asf_read_packet(demux,p,len,streamno,seq,time2,duration,x,keyframe);
1
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
458 p+=len;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
459 break;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
460 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
461
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
462 } // for segs
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
463 return 1; // success
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
464 }
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
465
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
466 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
467 return 0;
3b5f5d1c5041 Initial revision
arpi_esp
parents:
diff changeset
468 }
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
469
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
470 #include "stheader.h"
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
471
8123
9fc45fe0d444 *HUGE* set of compiler warning fixes, unused variables removal
arpi
parents: 7472
diff changeset
472 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
473
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17598
diff changeset
474 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
475 struct asf_priv* asf = demuxer->priv;
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
476 demux_stream_t *d_audio=demuxer->audio;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
477 demux_stream_t *d_video=demuxer->video;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
478 sh_audio_t *sh_audio=d_audio->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
479 // sh_video_t *sh_video=d_video->sh;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
480
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
481 //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
482 //FIXME: reports good or bad to steve@daviesfam.org please
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
483
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
484 //================= seek in ASF ==========================
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
485 float p_rate=asf->packetrate; // packets / sec
1628
bd1ef18cdf33 seeking flags implemented: 0x1=rel/abs and 0x2=time/percent
arpi
parents: 1567
diff changeset
486 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
487 (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
488 (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
489 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
490 off_t newpos;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
491 //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
492 // printf("ASF_seek: %d secs -> %d packs -> %d bytes \n",
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
493 // 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
494 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
495 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
496 // printf("\r -- asf: newpos=%d -- \n",newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
497 stream_seek(demuxer->stream,newpos);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
498
19961
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
499 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
500
13310
c629f7ac9b9f fix seeking in audio-only case (crash when seeking backwards, time reset to 0)
reimar
parents: 12877
diff changeset
501 if (d_video->id >= 0)
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
502 ds_fill_buffer(d_video);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
503 if(sh_audio){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
504 ds_fill_buffer(d_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
505 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
506
18710
c528c6c518f1 Clean up audio pts handling, make audio pts tracking in the audio-only
uau
parents: 18609
diff changeset
507 if (d_video->id >= 0)
1466
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
508 while(1){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
509 if(sh_audio && !d_audio->eof){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
510 float a_pts=d_audio->pts;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
511 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
512 // sync audio:
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
513 if (d_video->pts > a_pts){
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
514 skip_audio_frame(sh_audio);
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
515 // 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
516 continue;
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
517 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
518 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
519 if(d_video->flags&1) break; // found a keyframe!
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
520 if(!ds_fill_buffer(d_video)) break; // skip frame. EOF?
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
521 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
522
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
523
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
524 }
7845f6d7c4ba format-specific seeking code moved to demuxer_ stuff
arpi
parents: 1430
diff changeset
525
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
526 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
527 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
528 /* demux_stream_t *d_audio=demuxer->audio;
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
529 demux_stream_t *d_video=demuxer->video;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
530 sh_audio_t *sh_audio=d_audio->sh;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
531 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
532 */
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
533 switch(cmd) {
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
534 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
535 *((double *)arg)=(double)(asf->movielength);
8208
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
536 return DEMUXER_CTRL_OK;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
537
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
538 case DEMUXER_CTRL_GET_PERCENT_POS:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
539 return DEMUXER_CTRL_DONTKNOW;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
540
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
541 default:
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
542 return DEMUXER_CTRL_NOTIMPL;
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
543 }
ae5a2ae1c349 demuxer_control(), percent position and time length query implemented in
arpi
parents: 8123
diff changeset
544 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
545
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
546
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
547 static demuxer_t* demux_open_asf(demuxer_t* demuxer)
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
548 {
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
549 struct asf_priv* asf = demuxer->priv;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
550 sh_audio_t *sh_audio=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
551 sh_video_t *sh_video=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
552
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
553 //---- ASF header:
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
554 if(!asf) return NULL;
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
555 if (!read_asf_header(demuxer,asf)) {
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
556 free(asf);
17598
4b8193d51bda we cannot continue without a crash when read_asf_header fails, since some
reimar
parents: 17569
diff changeset
557 return NULL;
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
558 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
559 stream_reset(demuxer->stream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
560 stream_seek(demuxer->stream,demuxer->movi_start);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
561 // demuxer->idx_pos=0;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
562 // demuxer->endpos=avi_header.movi_end;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
563 if(demuxer->video->id != -2) {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
564 if(!ds_fill_buffer(demuxer->video)){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
565 mp_msg(MSGT_DEMUXER,MSGL_WARN,"ASF: " MSGTR_MissingVideoStream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
566 demuxer->video->sh=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
567 //printf("ASF: missing video stream!? contact the author, it may be a bug :(\n");
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
568 } else {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
569 sh_video=demuxer->video->sh;sh_video->ds=demuxer->video;
19961
9f011e6892e8 interpolate real fps of dvr-ms files using the extended stream properties.
nicodvb
parents: 18710
diff changeset
570 //sh_video->fps=1000.0f; sh_video->frametime=0.001f; // 1ms - now set when reading asf header
17992
2545bbd91450 Move global vars used for header parsing, etc to dewux->priv as it should
albeu
parents: 17932
diff changeset
571 //sh_video->i_bps=10*asf->packetsize; // FIXME!
20636
325db3f2aba3 don't set the resolution for dvr-ms files: in the asf headers it seems to
nicodvb
parents: 19961
diff changeset
572
325db3f2aba3 don't set the resolution for dvr-ms files: in the asf headers it seems to
nicodvb
parents: 19961
diff changeset
573 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
574 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
575 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
576 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
577 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
578 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
579
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
580 if(demuxer->audio->id!=-2){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
581 mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_ASFSearchingForAudioStream,demuxer->audio->id);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
582 if(!ds_fill_buffer(demuxer->audio)){
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
583 mp_msg(MSGT_DEMUXER,MSGL_INFO,"ASF: " MSGTR_MissingAudioStream);
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
584 demuxer->audio->sh=NULL;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
585 } else {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
586 sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
587 sh_audio->format=sh_audio->wf->wFormatTag;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
588 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
589 }
20792
dcaf8b9f47e9 Fix crash when attempting to seek in a streamed unseekable stream, like
gpoirier
parents: 20636
diff changeset
590 if(!demuxer->stream->seek)
dcaf8b9f47e9 Fix crash when attempting to seek in a streamed unseekable stream, like
gpoirier
parents: 20636
diff changeset
591 demuxer->seekable=0;
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
592
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
593 return demuxer;
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
594 }
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
595
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
596
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
597 demuxer_desc_t demuxer_desc_asf = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
598 "ASF demuxer",
17232
d318e2ff799e Typo in ASF demuxer selection by name (it's 'asf', not 'asv')
rtognimp
parents: 17226
diff changeset
599 "asf",
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
600 "ASF",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
601 "A'rpi",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
602 "ASF, WMV, WMA",
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
603 DEMUXER_TYPE_ASF,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
604 1, // safe autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
605 asf_check_header,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
606 demux_asf_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
607 demux_open_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
608 NULL, //demux_close_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
609 demux_seek_asf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
610 demux_asf_control
6b86089c2edd Demuxer modularization
rtognimp
parents: 15553
diff changeset
611 };