Mercurial > libavformat.hg
annotate file.c @ 4723:a2390c6a35e6 libavformat
Fix index generation in the way that it was supposed to be used. See the
discussion in the ML thread "[PATCH] rmdec.c: merge old/new packet reading
code".
Over time, this code broke somewhat, e.g. seq was never actually written
into (and was thus always 1, therefore the seq condition was always true),
whereas it was supposed to be set to the sequence number of the video slice
in case the video frame is divided over multiple RM packets (slices). The
problem of this is that packets other than those containing the beginning
of a video frame would be indexed as well.
Secondly, flags&2 is supposed to be true for video keyframes and for these
audio packets containing the start of a block. For some codecs (e.g. AAC),
that is every single packet, whereas for others (e.g. cook), that is the
packet containing the first of a series of scrambled packets that are to be
descrambled together. Indexing any of the following would lead to incomplete
and thus useless frames. Problem here is that flags would be reset to 2 to
indicate that the first packet is ready to be returned, and in addition if
no data was left to be returned (which is always true for the first packet),
then we wouldn't actually write the index entry anyway.
All in all, the idea was good and it probably worked at some point, but that
is long ago. This patch should at the very least make it likely for this code
to be executed again at the right times, i.e. the way it was originally
intended to be used.
author | rbultje |
---|---|
date | Sun, 15 Mar 2009 20:14:25 +0000 |
parents | b34d9614b887 |
children | dd9383951cb9 |
rev | line source |
---|---|
0 | 1 /* |
2 * Buffered file io for ffmpeg system | |
3 * Copyright (c) 2001 Fabrice Bellard | |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1171
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
3286 | 21 |
22 #include "libavutil/avstring.h" | |
0 | 23 #include "avformat.h" |
24 #include <fcntl.h> | |
4206 | 25 #if HAVE_SETMODE |
4200
898c3d1d9e4e
Use setmode() if it exists in <io.h>, and not based on O_BINARY.
ramiro
parents:
3973
diff
changeset
|
26 #include <io.h> |
898c3d1d9e4e
Use setmode() if it exists in <io.h>, and not based on O_BINARY.
ramiro
parents:
3973
diff
changeset
|
27 #endif |
0 | 28 #include <unistd.h> |
29 #include <sys/time.h> | |
2395 | 30 #include <stdlib.h> |
2774
477419a721a3
os_support.h is also needed for usleep and lseek on MinGW.
ramiro
parents:
2758
diff
changeset
|
31 #include "os_support.h" |
0 | 32 |
33 | |
34 /* standard file protocol */ | |
35 | |
36 static int file_open(URLContext *h, const char *filename, int flags) | |
37 { | |
38 int access; | |
39 int fd; | |
40 | |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
1787
diff
changeset
|
41 av_strstart(filename, "file:", &filename); |
3 | 42 |
364
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
43 if (flags & URL_RDWR) { |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
44 access = O_CREAT | O_TRUNC | O_RDWR; |
0d74e8abcb3d
avio patch by (Gildas Bazin <gbazin at altern dot org>)
michael
parents:
332
diff
changeset
|
45 } else if (flags & URL_WRONLY) { |
0 | 46 access = O_CREAT | O_TRUNC | O_WRONLY; |
47 } else { | |
48 access = O_RDONLY; | |
49 } | |
2205
28eb72f5208a
Check for O_BINARY instead of a list of systems that need it
ramiro
parents:
2193
diff
changeset
|
50 #ifdef O_BINARY |
0 | 51 access |= O_BINARY; |
52 #endif | |
53 fd = open(filename, access, 0666); | |
54 if (fd < 0) | |
1787
eb16c64144ee
This fixes error handling for BeOS, removing the need for some ifdefs.
mmu_man
parents:
1596
diff
changeset
|
55 return AVERROR(ENOENT); |
4634
77a5de3c9116
Remove size_t cast in setting s->priv_data directly to the (integer) file
rbultje
parents:
4206
diff
changeset
|
56 h->priv_data = (void *) fd; |
0 | 57 return 0; |
58 } | |
59 | |
60 static int file_read(URLContext *h, unsigned char *buf, int size) | |
61 { | |
4634
77a5de3c9116
Remove size_t cast in setting s->priv_data directly to the (integer) file
rbultje
parents:
4206
diff
changeset
|
62 int fd = (int) h->priv_data; |
0 | 63 return read(fd, buf, size); |
64 } | |
65 | |
66 static int file_write(URLContext *h, unsigned char *buf, int size) | |
67 { | |
4634
77a5de3c9116
Remove size_t cast in setting s->priv_data directly to the (integer) file
rbultje
parents:
4206
diff
changeset
|
68 int fd = (int) h->priv_data; |
0 | 69 return write(fd, buf, size); |
70 } | |
71 | |
72 /* XXX: use llseek */ | |
3973
549a09cf23fe
Remove offset_t typedef and use int64_t directly instead.
diego
parents:
3367
diff
changeset
|
73 static int64_t file_seek(URLContext *h, int64_t pos, int whence) |
0 | 74 { |
4634
77a5de3c9116
Remove size_t cast in setting s->priv_data directly to the (integer) file
rbultje
parents:
4206
diff
changeset
|
75 int fd = (int) h->priv_data; |
0 | 76 return lseek(fd, pos, whence); |
77 } | |
78 | |
79 static int file_close(URLContext *h) | |
80 { | |
4634
77a5de3c9116
Remove size_t cast in setting s->priv_data directly to the (integer) file
rbultje
parents:
4206
diff
changeset
|
81 int fd = (int) h->priv_data; |
0 | 82 return close(fd); |
83 } | |
84 | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
85 static int file_get_handle(URLContext *h) |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
86 { |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
87 return (int) h->priv_data; |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
88 } |
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
89 |
0 | 90 URLProtocol file_protocol = { |
91 "file", | |
92 file_open, | |
93 file_read, | |
94 file_write, | |
95 file_seek, | |
96 file_close, | |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
97 .url_get_file_handle = file_get_handle, |
0 | 98 }; |
99 | |
100 /* pipe protocol */ | |
101 | |
102 static int pipe_open(URLContext *h, const char *filename, int flags) | |
103 { | |
104 int fd; | |
3367 | 105 char *final; |
2395 | 106 av_strstart(filename, "pipe:", &filename); |
0 | 107 |
2395 | 108 fd = strtol(filename, &final, 10); |
109 if((filename == final) || *final ) {/* No digits found, or something like 10ab */ | |
2394 | 110 if (flags & URL_WRONLY) { |
111 fd = 1; | |
112 } else { | |
113 fd = 0; | |
114 } | |
2395 | 115 } |
4206 | 116 #if HAVE_SETMODE |
394 | 117 setmode(fd, O_BINARY); |
118 #endif | |
4634
77a5de3c9116
Remove size_t cast in setting s->priv_data directly to the (integer) file
rbultje
parents:
4206
diff
changeset
|
119 h->priv_data = (void *) fd; |
605 | 120 h->is_streamed = 1; |
0 | 121 return 0; |
122 } | |
123 | |
124 URLProtocol pipe_protocol = { | |
125 "pipe", | |
126 pipe_open, | |
2352
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
127 file_read, |
3dfa90f47d53
Make the pipe URLProtocol share read and write functions with the file URLProtocol
ramiro
parents:
2205
diff
changeset
|
128 file_write, |
4640
b34d9614b887
Add url_get_file_handle(), which is used to get the file descriptor
rbultje
parents:
4634
diff
changeset
|
129 .url_get_file_handle = file_get_handle, |
0 | 130 }; |