Mercurial > libavformat.hg
annotate avio.h @ 1206:e60bf67d9bf8 libavformat
The reader ignores the size of the ASF data object and keeps on
reading even beyond it.
Therefore if the ASF file includes an index object at its end, the
reader will treat the index like data, but of course will fail since
it thinks that the data is corrupted.
When reading an asf file with an index object, ffmpeg will
complain at the end of the file that it read an invalid header.
Patch by Kohn Emil Dan, < emild A cs P technion P ac P il >
Original thead:
Date: Apr 18, 2006 4:11 PM
Subject: [Ffmpeg-devel] Two ASF related bugs and fixes
author | gpoirier |
---|---|
date | Sat, 29 Jul 2006 16:07:19 +0000 |
parents | bfea7dcd2698 |
children | 8bf9be9bb107 |
rev | line source |
---|---|
0 | 1 #ifndef AVIO_H |
2 #define AVIO_H | |
3 | |
4 /* output byte stream handling */ | |
5 | |
65 | 6 typedef int64_t offset_t; |
0 | 7 |
8 /* unbuffered I/O */ | |
9 | |
10 struct URLContext { | |
11 struct URLProtocol *prot; | |
885 | 12 int flags; |
0 | 13 int is_streamed; /* true if streamed (no seek possible), default = false */ |
14 int max_packet_size; /* if non zero, the stream is packetized with this max packet size */ | |
15 void *priv_data; | |
19 | 16 char filename[1]; /* specified filename */ |
0 | 17 }; |
18 | |
19 typedef struct URLContext URLContext; | |
20 | |
21 typedef struct URLPollEntry { | |
22 URLContext *handle; | |
23 int events; | |
24 int revents; | |
25 } URLPollEntry; | |
26 | |
27 #define URL_RDONLY 0 | |
28 #define URL_WRONLY 1 | |
29 #define URL_RDWR 2 | |
30 | |
177 | 31 typedef int URLInterruptCB(void); |
32 | |
0 | 33 int url_open(URLContext **h, const char *filename, int flags); |
34 int url_read(URLContext *h, unsigned char *buf, int size); | |
35 int url_write(URLContext *h, unsigned char *buf, int size); | |
36 offset_t url_seek(URLContext *h, offset_t pos, int whence); | |
37 int url_close(URLContext *h); | |
38 int url_exist(const char *filename); | |
39 offset_t url_filesize(URLContext *h); | |
40 int url_get_max_packet_size(URLContext *h); | |
19 | 41 void url_get_filename(URLContext *h, char *buf, int buf_size); |
42 | |
177 | 43 /* the callback is called in blocking functions to test regulary if |
44 asynchronous interruption is needed. -EINTR is returned in this | |
45 case by the interrupted function. 'NULL' means no interrupt | |
46 callback is given. */ | |
47 void url_set_interrupt_cb(URLInterruptCB *interrupt_cb); | |
48 | |
0 | 49 /* not implemented */ |
50 int url_poll(URLPollEntry *poll_table, int n, int timeout); | |
51 | |
52 typedef struct URLProtocol { | |
53 const char *name; | |
54 int (*url_open)(URLContext *h, const char *filename, int flags); | |
55 int (*url_read)(URLContext *h, unsigned char *buf, int size); | |
56 int (*url_write)(URLContext *h, unsigned char *buf, int size); | |
57 offset_t (*url_seek)(URLContext *h, offset_t pos, int whence); | |
58 int (*url_close)(URLContext *h); | |
59 struct URLProtocol *next; | |
60 } URLProtocol; | |
61 | |
62 extern URLProtocol *first_protocol; | |
177 | 63 extern URLInterruptCB *url_interrupt_cb; |
0 | 64 |
65 int register_protocol(URLProtocol *protocol); | |
66 | |
67 typedef struct { | |
68 unsigned char *buffer; | |
69 int buffer_size; | |
70 unsigned char *buf_ptr, *buf_end; | |
71 void *opaque; | |
65 | 72 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); |
554 | 73 int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); |
778
4fbe04f998bf
Fix url_fsize for large files patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
764
diff
changeset
|
74 offset_t (*seek)(void *opaque, offset_t offset, int whence); |
0 | 75 offset_t pos; /* position in the file of the current buffer */ |
76 int must_flush; /* true if the next seek should flush */ | |
77 int eof_reached; /* true if eof reached */ | |
78 int write_flag; /* true if open for writing */ | |
79 int is_streamed; | |
80 int max_packet_size; | |
418
41da3366d341
checksuming for nut & nice checksum API for libavformat
michael
parents:
389
diff
changeset
|
81 unsigned long checksum; |
41da3366d341
checksuming for nut & nice checksum API for libavformat
michael
parents:
389
diff
changeset
|
82 unsigned char *checksum_ptr; |
41da3366d341
checksuming for nut & nice checksum API for libavformat
michael
parents:
389
diff
changeset
|
83 unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size); |
554 | 84 int error; ///< contains the error code or 0 if no error happened |
0 | 85 } ByteIOContext; |
86 | |
87 int init_put_byte(ByteIOContext *s, | |
88 unsigned char *buffer, | |
89 int buffer_size, | |
90 int write_flag, | |
91 void *opaque, | |
65 | 92 int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), |
554 | 93 int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), |
778
4fbe04f998bf
Fix url_fsize for large files patch by (Wolfram Gloger: wmglo, dent med uni-muenchen de)
michael
parents:
764
diff
changeset
|
94 offset_t (*seek)(void *opaque, offset_t offset, int whence)); |
0 | 95 |
96 void put_byte(ByteIOContext *s, int b); | |
97 void put_buffer(ByteIOContext *s, const unsigned char *buf, int size); | |
65 | 98 void put_le64(ByteIOContext *s, uint64_t val); |
99 void put_be64(ByteIOContext *s, uint64_t val); | |
0 | 100 void put_le32(ByteIOContext *s, unsigned int val); |
101 void put_be32(ByteIOContext *s, unsigned int val); | |
937 | 102 void put_le24(ByteIOContext *s, unsigned int val); |
822 | 103 void put_be24(ByteIOContext *s, unsigned int val); |
0 | 104 void put_le16(ByteIOContext *s, unsigned int val); |
105 void put_be16(ByteIOContext *s, unsigned int val); | |
106 void put_tag(ByteIOContext *s, const char *tag); | |
107 | |
108 void put_strz(ByteIOContext *s, const char *buf); | |
109 | |
110 offset_t url_fseek(ByteIOContext *s, offset_t offset, int whence); | |
111 void url_fskip(ByteIOContext *s, offset_t offset); | |
112 offset_t url_ftell(ByteIOContext *s); | |
764
cdb845a57ae4
drop most url_fileno() calls (allows to use ByteIOContext directly in caller apps instead of URLProtocol)
aurel
parents:
554
diff
changeset
|
113 offset_t url_fsize(ByteIOContext *s); |
0 | 114 int url_feof(ByteIOContext *s); |
554 | 115 int url_ferror(ByteIOContext *s); |
0 | 116 |
117 #define URL_EOF (-1) | |
118 int url_fgetc(ByteIOContext *s); | |
206
3a493a2e5bba
libavformat/avio.h compilation problem in VisualC++ by (lethean at realtime dot ssu dot ac dot kr)
michaelni
parents:
177
diff
changeset
|
119 #ifdef __GNUC__ |
265
786e8286ea4a
Patch for attribute(printf) by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michaelni
parents:
206
diff
changeset
|
120 int url_fprintf(ByteIOContext *s, const char *fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); |
206
3a493a2e5bba
libavformat/avio.h compilation problem in VisualC++ by (lethean at realtime dot ssu dot ac dot kr)
michaelni
parents:
177
diff
changeset
|
121 #else |
3a493a2e5bba
libavformat/avio.h compilation problem in VisualC++ by (lethean at realtime dot ssu dot ac dot kr)
michaelni
parents:
177
diff
changeset
|
122 int url_fprintf(ByteIOContext *s, const char *fmt, ...); |
3a493a2e5bba
libavformat/avio.h compilation problem in VisualC++ by (lethean at realtime dot ssu dot ac dot kr)
michaelni
parents:
177
diff
changeset
|
123 #endif |
0 | 124 char *url_fgets(ByteIOContext *s, char *buf, int buf_size); |
125 | |
126 void put_flush_packet(ByteIOContext *s); | |
127 | |
128 int get_buffer(ByteIOContext *s, unsigned char *buf, int size); | |
389
e14fcd57ad2f
decode latency patch by (Leon van Stuivenberg <l dot vanstuivenberg at chello dot nl>)
michael
parents:
265
diff
changeset
|
129 int get_partial_buffer(ByteIOContext *s, unsigned char *buf, int size); |
0 | 130 int get_byte(ByteIOContext *s); |
937 | 131 unsigned int get_le24(ByteIOContext *s); |
0 | 132 unsigned int get_le32(ByteIOContext *s); |
65 | 133 uint64_t get_le64(ByteIOContext *s); |
0 | 134 unsigned int get_le16(ByteIOContext *s); |
135 | |
136 char *get_strz(ByteIOContext *s, char *buf, int maxlen); | |
137 unsigned int get_be16(ByteIOContext *s); | |
822 | 138 unsigned int get_be24(ByteIOContext *s); |
0 | 139 unsigned int get_be32(ByteIOContext *s); |
65 | 140 uint64_t get_be64(ByteIOContext *s); |
0 | 141 |
142 static inline int url_is_streamed(ByteIOContext *s) | |
143 { | |
144 return s->is_streamed; | |
145 } | |
146 | |
147 int url_fdopen(ByteIOContext *s, URLContext *h); | |
148 int url_setbufsize(ByteIOContext *s, int buf_size); | |
149 int url_fopen(ByteIOContext *s, const char *filename, int flags); | |
150 int url_fclose(ByteIOContext *s); | |
151 URLContext *url_fileno(ByteIOContext *s); | |
152 int url_fget_max_packet_size(ByteIOContext *s); | |
153 | |
65 | 154 int url_open_buf(ByteIOContext *s, uint8_t *buf, int buf_size, int flags); |
0 | 155 int url_close_buf(ByteIOContext *s); |
156 | |
157 int url_open_dyn_buf(ByteIOContext *s); | |
158 int url_open_dyn_packet_buf(ByteIOContext *s, int max_packet_size); | |
65 | 159 int url_close_dyn_buf(ByteIOContext *s, uint8_t **pbuffer); |
0 | 160 |
418
41da3366d341
checksuming for nut & nice checksum API for libavformat
michael
parents:
389
diff
changeset
|
161 unsigned long get_checksum(ByteIOContext *s); |
41da3366d341
checksuming for nut & nice checksum API for libavformat
michael
parents:
389
diff
changeset
|
162 void init_checksum(ByteIOContext *s, unsigned long (*update_checksum)(unsigned long c, const uint8_t *p, unsigned int len), unsigned long checksum); |
41da3366d341
checksuming for nut & nice checksum API for libavformat
michael
parents:
389
diff
changeset
|
163 |
0 | 164 /* file.c */ |
165 extern URLProtocol file_protocol; | |
166 extern URLProtocol pipe_protocol; | |
167 | |
168 /* udp.c */ | |
169 extern URLProtocol udp_protocol; | |
170 int udp_set_remote_url(URLContext *h, const char *uri); | |
171 int udp_get_local_port(URLContext *h); | |
172 int udp_get_file_handle(URLContext *h); | |
173 | |
174 /* tcp.c */ | |
175 extern URLProtocol tcp_protocol; | |
176 | |
177 /* http.c */ | |
178 extern URLProtocol http_protocol; | |
179 | |
180 #endif | |
181 |