annotate fifo.c @ 727:98b64f65be0d libavutil

Reorganise intreadwrite.h This changes intreadwrite.h to support per-arch implementations of the various macros allowing us to take advantage of special instructions or other properties the compiler does not know about.
author mru
date Sat, 18 Apr 2009 00:00:22 +0000
parents 2f890bb12bbc
children 9b61454d2fee
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
722
2f890bb12bbc Implement av_fifo_space().
stefano
parents: 691
diff changeset
57 int av_fifo_space(AVFifoBuffer *f)
2f890bb12bbc Implement av_fifo_space().
stefano
parents: 691
diff changeset
58 {
2f890bb12bbc Implement av_fifo_space().
stefano
parents: 691
diff changeset
59 return f->end - f->buffer - av_fifo_size(f);
2f890bb12bbc Implement av_fifo_space().
stefano
parents: 691
diff changeset
60 }
2f890bb12bbc Implement av_fifo_space().
stefano
parents: 691
diff changeset
61
564
a1ac1cb9a91b Implement av_fifo_realloc2().
stefano
parents: 511
diff changeset
62 int av_fifo_realloc2(AVFifoBuffer *f, unsigned int new_size) {
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
63 unsigned int old_size= f->end - f->buffer;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
64
676
5e391d180d81 Try to fix the 1 byte cannot be used issue.
michael
parents: 633
diff changeset
65 if(old_size < new_size){
225
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
66 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
67 AVFifoBuffer *f2= av_fifo_alloc(new_size);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
68
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
69 if (!f2)
564
a1ac1cb9a91b Implement av_fifo_realloc2().
stefano
parents: 511
diff changeset
70 return -1;
691
4e9e0c52ed08 Reorder arguments for av_fifo_generic_read to be more logical and
reimar
parents: 688
diff changeset
71 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
72 f2->wptr += len;
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
73 f2->wndx += len;
225
0b93dab98397 simplify av_fifo_realloc()
michael
parents: 224
diff changeset
74 av_free(f->buffer);
679
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
75 *f= *f2;
58a5033060c3 Allocate AVFifoBuffer through the fifo API to reduce future API/ABI issues.
michael
parents: 677
diff changeset
76 av_free(f2);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
77 }
564
a1ac1cb9a91b Implement av_fifo_realloc2().
stefano
parents: 511
diff changeset
78 return 0;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
79 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
80
493
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
81 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
82 {
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
83 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
84 do {
223
df2f250bda3f simplify
michael
parents: 222
diff changeset
85 int len = FFMIN(f->end - f->wptr, size);
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
86 if(func) {
493
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
87 if(func(src, f->wptr, len) <= 0)
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
88 break;
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
89 } else {
493
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
90 memcpy(f->wptr, src, len);
97dd9756349c cosmetics (by Bj«Órn Axelsson)
benoit
parents: 492
diff changeset
91 src = (uint8_t*)src + len;
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
92 }
677
5dd1730abf98 Comments to indicate where memory barriers may be needed.
michael
parents: 676
diff changeset
93 // Write memory barrier needed for SMP here in theory
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
94 f->wptr += len;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
95 if (f->wptr >= f->end)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
96 f->wptr = f->buffer;
676
5e391d180d81 Try to fix the 1 byte cannot be used issue.
michael
parents: 633
diff changeset
97 f->wndx += len;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
98 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
99 } while (size > 0);
492
75f096258d14 Add a generic write function to av_fifo.
benoit
parents: 230
diff changeset
100 return total - size;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
101 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
102
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
103
691
4e9e0c52ed08 Reorder arguments for av_fifo_generic_read to be more logical and
reimar
parents: 688
diff changeset
104 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
105 {
677
5dd1730abf98 Comments to indicate where memory barriers may be needed.
michael
parents: 676
diff changeset
106 // 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
107 do {
223
df2f250bda3f simplify
michael
parents: 222
diff changeset
108 int len = FFMIN(f->end - f->rptr, buf_size);
224
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
109 if(func) func(dest, f->rptr, len);
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
110 else{
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
111 memcpy(dest, f->rptr, len);
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
112 dest = (uint8_t*)dest + len;
a9880a7685e7 remove near duplicate function
michael
parents: 223
diff changeset
113 }
677
5dd1730abf98 Comments to indicate where memory barriers may be needed.
michael
parents: 676
diff changeset
114 // memory barrier needed for SMP here in theory
227
158b400d2f75 avoid code duplication
michael
parents: 226
diff changeset
115 av_fifo_drain(f, len);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
116 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
117 } while (buf_size > 0);
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
118 return 0;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
119 }
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
120
633
8c48a1b999a3 spelling/grammar/consistency review part I
diego
parents: 623
diff changeset
121 /** Discard data from the FIFO. */
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
122 void av_fifo_drain(AVFifoBuffer *f, int size)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
123 {
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
124 f->rptr += size;
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
125 if (f->rptr >= f->end)
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
126 f->rptr -= f->end - f->buffer;
676
5e391d180d81 Try to fix the 1 byte cannot be used issue.
michael
parents: 633
diff changeset
127 f->rndx += size;
110
813b7366ac3f * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents:
diff changeset
128 }