annotate fifo.c @ 713:2f9c4e9ae095 libavutil

Use a wildcard match instead of a list to remove test programs. This is robust against renames and also removes test programs not (yet) hooked up in the main Makefiles.
author diego
date Thu, 26 Mar 2009 10:12:21 +0000
parents 4e9e0c52ed08
children 2f890bb12bbc
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 /*
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 623
diff changeset
2 * a very simple circular buffer FIFO implementation
110
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
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
25 AVFifoBuffer *av_fifo_alloc(unsigned int size)
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
26 {
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
27 AVFifoBuffer *f= av_mallocz(sizeof(AVFifoBuffer));
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
28 if(!f)
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
29 return NULL;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
30 f->buffer = av_malloc(size);
229
3f5c648b82c4 simpler branch structure in init (16 bytes smaller object file)
michael
parents: 228
diff changeset
31 f->end = f->buffer + size;
688
91216685a7ae Add av_fifo_reset function to completely reset fifo state, which makes
reimar
parents: 687
diff changeset
32 av_fifo_reset(f);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
33 if (!f->buffer)
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
34 av_freep(&f);
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
35 return f;
110
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
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
38 void av_fifo_free(AVFifoBuffer *f)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
39 {
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
40 if(f){
687
michael
parents: 686
diff changeset
41 av_free(f->buffer);
michael
parents: 686
diff changeset
42 av_free(f);
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
43 }
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
44 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
45
688
91216685a7ae Add av_fifo_reset function to completely reset fifo state, which makes
reimar
parents: 687
diff changeset
46 void av_fifo_reset(AVFifoBuffer *f)
91216685a7ae Add av_fifo_reset function to completely reset fifo state, which makes
reimar
parents: 687
diff changeset
47 {
91216685a7ae Add av_fifo_reset function to completely reset fifo state, which makes
reimar
parents: 687
diff changeset
48 f->wptr = f->rptr = f->buffer;
91216685a7ae Add av_fifo_reset function to completely reset fifo state, which makes
reimar
parents: 687
diff changeset
49 f->wndx = f->rndx = 0;
91216685a7ae Add av_fifo_reset function to completely reset fifo state, which makes
reimar
parents: 687
diff changeset
50 }
91216685a7ae Add av_fifo_reset function to completely reset fifo state, which makes
reimar
parents: 687
diff changeset
51
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
52 int av_fifo_size(AVFifoBuffer *f)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
53 {
676
5e391d180d81 Try to fix the 1 byte cannot be used issue.
michael
parents: 633
diff changeset
54 return (uint32_t)(f->wndx - f->rndx);
110
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
564
a1ac1cb9a91b Implement av_fifo_realloc2().
stefano
parents: 511
diff changeset
57 int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) {
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
58 unsigned int old_size= f->end - f->buffer;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
59
676
5e391d180d81 Try to fix the 1 byte cannot be used issue.
michael
parents: 633
diff changeset
60 if(old_size < new_size){
225
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
61 int len= av_fifo_size(f);
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
62 AVFifoBuffer *f2= av_fifo_alloc(new_size);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
63
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
64 if (!f2)
564
a1ac1cb9a91b Implement av_fifo_realloc2().
stefano
parents: 511
diff changeset
65 return -1;
691
4e9e0c52ed08 Reorder arguments for av_fifo_generic_read to be more logical and
reimar
parents: 688
diff changeset
66 av_fifo_generic_read(f, f2->buffer, len, NULL);
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
67 f2->wptr += len;
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
68 f2->wndx += len;
225
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
69 av_free(f->buffer);
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
70 *f= *f2;
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
71 av_free(f2);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
72 }
564
a1ac1cb9a91b Implement av_fifo_realloc2().
stefano
parents: 511
diff changeset
73 return 0;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
74 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
75
493
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
76 int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int))
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
77 {
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
78 int total = size;
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
79 do {
223
df2f250bda3f simplify
michael
parents: 222
diff changeset
80 int len = FFMIN(f->end - f->wptr, size);
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
81 if(func) {
493
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
82 if(func(src, f->wptr, len) <= 0)
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
83 break;
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
84 } else {
493
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
85 memcpy(f->wptr, src, len);
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
86 src = (uint8_t*)src + len;
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
87 }
677
5dd1730abf98 Comments to indicate where memory barriers may be needed.
michael
parents: 676
diff changeset
88 // Write memory barrier needed for SMP here in theory
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
89 f->wptr += len;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
90 if (f->wptr >= f->end)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
91 f->wptr = f->buffer;
676
5e391d180d81 Try to fix the 1 byte cannot be used issue.
michael
parents: 633
diff changeset
92 f->wndx += len;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
93 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
94 } while (size > 0);
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
95 return total - size;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
96 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
97
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
98
691
4e9e0c52ed08 Reorder arguments for av_fifo_generic_read to be more logical and
reimar
parents: 688
diff changeset
99 int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int))
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
100 {
677
5dd1730abf98 Comments to indicate where memory barriers may be needed.
michael
parents: 676
diff changeset
101 // Read memory barrier needed for SMP here in theory
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
102 do {
223
df2f250bda3f simplify
michael
parents: 222
diff changeset
103 int len = FFMIN(f->end - f->rptr, buf_size);
224
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
104 if(func) func(dest, f->rptr, len);
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
105 else{
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
106 memcpy(dest, f->rptr, len);
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
107 dest = (uint8_t*)dest + len;
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
108 }
677
5dd1730abf98 Comments to indicate where memory barriers may be needed.
michael
parents: 676
diff changeset
109 // memory barrier needed for SMP here in theory
227
158b400d2f75 avoid code duplication
michael
parents: 226
diff changeset
110 av_fifo_drain(f, len);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
111 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
112 } while (buf_size > 0);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
113 return 0;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
114 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
115
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 623
diff changeset
116 /** Discard data from the FIFO. */
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
117 void av_fifo_drain(AVFifoBuffer *f, int size)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
118 {
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
119 f->rptr += size;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
120 if (f->rptr >= f->end)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
121 f->rptr -= f->end - f->buffer;
676
5e391d180d81 Try to fix the 1 byte cannot be used issue.
michael
parents: 633
diff changeset
122 f->rndx += size;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
123 }