annotate fifo.c @ 374:8805bba131a9 libavutil

Add attribute that forces alignment of stack to functions that need it. Necessary for systems that don't align by default to 16 bytes, required by some SSE instructions. Requires GCC >= 4.2. Based on patch by Ga¸«³l Chardon.
author ramiro
date Mon, 13 Aug 2007 15:28:29 +0000
parents 4c85ac99ab37
children 75f096258d14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
1 /*
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
2 * A very simple circular buffer FIFO implementation
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
4 * Copyright (c) 2006 Roman Shaposhnik
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
16 * Lesser General Public License for more details.
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
17 *
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
21 */
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
22 #include "common.h"
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
23 #include "fifo.h"
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
24
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
25 int av_fifo_init(AVFifoBuffer *f, int size)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
30 if (!f->buffer)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
31 return -1;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
32 return 0;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
33 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
34
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
35 void av_fifo_free(AVFifoBuffer *f)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
36 {
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
37 av_free(f->buffer);
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
38 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
39
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
40 int av_fifo_size(AVFifoBuffer *f)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
41 {
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
42 int size = f->wptr - f->rptr;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
43 if (size < 0)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
44 size += f->end - f->buffer;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
45 return size;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
46 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
47
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
48 /**
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
49 * Get data from the fifo (returns -1 if not enough data).
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
50 */
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
51 int av_fifo_read(AVFifoBuffer *f, uint8_t *buf, int buf_size)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
52 {
224
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
53 return av_fifo_generic_read(f, buf_size, NULL, buf);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
54 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
55
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
56 /**
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
57 * Resizes a FIFO.
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
58 */
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
59 void av_fifo_realloc(AVFifoBuffer *f, unsigned int new_size) {
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
60 unsigned int old_size= f->end - f->buffer;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
61
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
62 if(old_size < new_size){
225
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
63 int len= av_fifo_size(f);
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
64 AVFifoBuffer f2;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
65
225
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
66 av_fifo_init(&f2, new_size);
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
67 av_fifo_read(f, f2.buffer, len);
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
68 f2.wptr += len;
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
69 av_free(f->buffer);
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
70 *f= f2;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
71 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
72 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
73
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
74 void av_fifo_write(AVFifoBuffer *f, const uint8_t *buf, int size)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
df2f250bda3f simplify
michael
parents: 222
diff changeset
77 int len = FFMIN(f->end - f->wptr, size);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
78 memcpy(f->wptr, buf, len);
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
79 f->wptr += len;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
80 if (f->wptr >= f->end)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
81 f->wptr = f->buffer;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
82 buf += len;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
85 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
86
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
87
228
a9a6ed6ec73d doxygenize
michael
parents: 227
diff changeset
88 /** get data from the fifo (return -1 if not enough data) */
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
89 int av_fifo_generic_read(AVFifoBuffer *f, int buf_size, void (*func)(void*, void*, int), void* dest)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
90 {
223
df2f250bda3f simplify
michael
parents: 222
diff changeset
91 int size = av_fifo_size(f);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
92
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
93 if (size < buf_size)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
df2f250bda3f simplify
michael
parents: 222
diff changeset
96 int len = FFMIN(f->end - f->rptr, buf_size);
224
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
97 if(func) func(dest, f->rptr, len);
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
98 else{
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
99 memcpy(dest, f->rptr, len);
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
100 dest = (uint8_t*)dest + len;
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
101 }
227
158b400d2f75 avoid code duplication
michael
parents: 226
diff changeset
102 av_fifo_drain(f, len);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
105 return 0;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
106 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
107
228
a9a6ed6ec73d doxygenize
michael
parents: 227
diff changeset
108 /** discard data from the fifo */
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
109 void av_fifo_drain(AVFifoBuffer *f, int size)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
110 {
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
111 f->rptr += size;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
112 if (f->rptr >= f->end)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
113 f->rptr -= f->end - f->buffer;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
114 }