Mercurial > libavutil.hg
annotate fifo.c @ 240:80f17646fa2d libavutil
mxf aes decryption support, patch by Reimar, simplified to only look for first crypto context, will be extended once we get files with multiple cryptocontext, and hope that they won't have broken container ul
author | bcoudurier |
---|---|
date | Sun, 11 Feb 2007 12:50:33 +0000 |
parents | 4c85ac99ab37 |
children | 75f096258d14 |
rev | line source |
---|---|
110 | 1 /* |
2 * A very simple circular buffer FIFO implementation | |
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard | |
4 * Copyright (c) 2006 Roman Shaposhnik | |
5 * | |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
110
diff
changeset
|
6 * This file is part of FFmpeg. |
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
110
diff
changeset
|
7 * |
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
110
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
110 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
110
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
110 | 12 * |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
110
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
110 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
116
d76a36742464
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
110
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
110 | 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 */ | |
22 #include "common.h" | |
23 #include "fifo.h" | |
24 | |
25 int av_fifo_init(AVFifoBuffer *f, int size) | |
26 { | |
226
fb0c5c158c67
better to set things to NULL instead of random in case of out of mem
michael
parents:
225
diff
changeset
|
27 f->wptr = f->rptr = |
110 | 28 f->buffer = av_malloc(size); |
229
3f5c648b82c4
simpler branch structure in init (16 bytes smaller object file)
michael
parents:
228
diff
changeset
|
29 f->end = f->buffer + size; |
110 | 30 if (!f->buffer) |
31 return -1; | |
32 return 0; | |
33 } | |
34 | |
35 void av_fifo_free(AVFifoBuffer *f) | |
36 { | |
37 av_free(f->buffer); | |
38 } | |
39 | |
40 int av_fifo_size(AVFifoBuffer *f) | |
41 { | |
42 int size = f->wptr - f->rptr; | |
43 if (size < 0) | |
44 size += f->end - f->buffer; | |
45 return size; | |
46 } | |
47 | |
48 /** | |
49 * Get data from the fifo (returns -1 if not enough data). | |
50 */ | |
51 int av_fifo_read(AVFifoBuffer *f, uint8_t *buf, int buf_size) | |
52 { | |
224 | 53 return av_fifo_generic_read(f, buf_size, NULL, buf); |
110 | 54 } |
55 | |
56 /** | |
57 * Resizes a FIFO. | |
58 */ | |
59 void av_fifo_realloc(AVFifoBuffer *f, unsigned int new_size) { | |
60 unsigned int old_size= f->end - f->buffer; | |
61 | |
62 if(old_size < new_size){ | |
225 | 63 int len= av_fifo_size(f); |
64 AVFifoBuffer f2; | |
110 | 65 |
225 | 66 av_fifo_init(&f2, new_size); |
67 av_fifo_read(f, f2.buffer, len); | |
68 f2.wptr += len; | |
69 av_free(f->buffer); | |
70 *f= f2; | |
110 | 71 } |
72 } | |
73 | |
74 void av_fifo_write(AVFifoBuffer *f, const uint8_t *buf, int size) | |
75 { | |
230
4c85ac99ab37
change while loops to do-while as the condition is true the first time and the check just wastes cpu cycles
michael
parents:
229
diff
changeset
|
76 do { |
223 | 77 int len = FFMIN(f->end - f->wptr, size); |
110 | 78 memcpy(f->wptr, buf, len); |
79 f->wptr += len; | |
80 if (f->wptr >= f->end) | |
81 f->wptr = f->buffer; | |
82 buf += len; | |
83 size -= len; | |
230
4c85ac99ab37
change while loops to do-while as the condition is true the first time and the check just wastes cpu cycles
michael
parents:
229
diff
changeset
|
84 } while (size > 0); |
110 | 85 } |
86 | |
87 | |
228 | 88 /** get data from the fifo (return -1 if not enough data) */ |
110 | 89 int av_fifo_generic_read(AVFifoBuffer *f, int buf_size, void (*func)(void*, void*, int), void* dest) |
90 { | |
223 | 91 int size = av_fifo_size(f); |
110 | 92 |
93 if (size < buf_size) | |
94 return -1; | |
230
4c85ac99ab37
change while loops to do-while as the condition is true the first time and the check just wastes cpu cycles
michael
parents:
229
diff
changeset
|
95 do { |
223 | 96 int len = FFMIN(f->end - f->rptr, buf_size); |
224 | 97 if(func) func(dest, f->rptr, len); |
98 else{ | |
99 memcpy(dest, f->rptr, len); | |
100 dest = (uint8_t*)dest + len; | |
101 } | |
227 | 102 av_fifo_drain(f, len); |
110 | 103 buf_size -= len; |
230
4c85ac99ab37
change while loops to do-while as the condition is true the first time and the check just wastes cpu cycles
michael
parents:
229
diff
changeset
|
104 } while (buf_size > 0); |
110 | 105 return 0; |
106 } | |
107 | |
228 | 108 /** discard data from the fifo */ |
110 | 109 void av_fifo_drain(AVFifoBuffer *f, int size) |
110 { | |
111 f->rptr += size; | |
112 if (f->rptr >= f->end) | |
113 f->rptr -= f->end - f->buffer; | |
114 } |