1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include "FifoVideoFrames.h"
FifoVideoFrames::FifoVideoFrames(int s, gavl_video_format_t * f) {
size = s ;
start = 0 ;
end = 0 ;
count = 0;
format = new gavl_video_format_t;
gavl_video_format_copy(format, f);
fifoPtr = new gavl_video_frame_t * [size] ;
for(int i=0; i < size; i++) {
fifoPtr[i] = gavl_video_frame_create( format );
}
pthread_mutex_init (&mut, 0);
}
FifoVideoFrames::~FifoVideoFrames() {
//printf("deleting fifo \n");
for(int i=0; i < size; i++) {
gavl_video_frame_destroy( fifoPtr[i] );
}
delete format;
delete[] fifoPtr;
pthread_mutex_destroy (&mut);
//printf("deleted fifo \n");
}
// empty the fifo of any content
void FifoVideoFrames::Flush() {
pthread_mutex_lock (&mut);
start = 0 ;
end = 0 ;
count = 0;
//printf("FifoVideoFrames::flushed size=%d\n", count);
pthread_mutex_unlock (&mut);
}
// push an element onto the FifoVideoFrames
bool FifoVideoFrames::Append( gavl_video_frame_t * source) {
bool ret = false;
//Dump("Appending a frame ");
pthread_mutex_lock (&mut);
if ( count < size ) { // if there is room for one more
gavl_video_frame_copy(format, fifoPtr[end], source) ;
fifoPtr[end]->timestamp = source->timestamp;
fifoPtr[end]->duration = source->duration;
if (++end >= size)
end = 0;
count++;
ret = true;
} // no room in fifo, return false
pthread_mutex_unlock (&mut);
//Dump("Appended a frame ");
return ret;
}
// remove an element off the front FifoVideoFrames
bool FifoVideoFrames::Get( ) {
bool ret = false;
pthread_mutex_lock (&mut);
if ( count > 0 ) { // if there any items in the fifo
if ( ++start >= size )
start = 0;
count--;
ret = true;
}
pthread_mutex_unlock (&mut);
//Dump("Got a frame ");
return ret;
}
// get an element off the FifoVideoFrames
bool FifoVideoFrames::Get( gavl_video_frame_t * dest) {
bool ret = false;
//Dump("Getting a frame ");
pthread_mutex_lock (&mut);
if ( count > 0 ) { // if there any items in the fifo
gavl_video_frame_copy(format, dest, fifoPtr[start]) ;
dest->timestamp = fifoPtr[start]->timestamp;
dest->duration = fifoPtr[start]->duration;
if ( ++start >= size )
start = 0;
count--;
ret = true;
}
pthread_mutex_unlock (&mut);
//Dump("Got a frame ");
return ret;
}
/*
void FifoVideoFrames::Dump( char * c) {
int i,j = 0;
pthread_mutex_lock (&mut);
printf("%s -----------------------\n", c);
for( i=0;i<size;i++) {
//j=start+i;
//if (j >= size)
// j = j -size;
j=i;
if ( j == start)
textcolor(BRIGHT, GREEN, BLACK);
if (j == end)
textcolor(BRIGHT, RED, BLACK);
if (j == end && j == start)
textcolor(BRIGHT, YELLOW, BLACK);
printf("[%d]=%ld ", j, fifoPtr[j]->timestamp);
textcolor(RESET, BLACK, WHITE);
}
printf("\n");
printf("start=%02d, end=%02d, count=%02d\n", start,end,count);
printf("-----------------------\n");
pthread_mutex_unlock (&mut);
}
*/
bool FifoVideoFrames::FreeSpace() { bool ret; pthread_mutex_lock(&mut); ret = (count < size);pthread_mutex_unlock (&mut); return ret;}
bool FifoVideoFrames::isEmpty() { bool c; pthread_mutex_lock(&mut); c = (count == 0) ; pthread_mutex_unlock (&mut); return c; }
bool FifoVideoFrames::isFull() { bool c; pthread_mutex_lock(&mut); c = (count == size ); pthread_mutex_unlock (&mut); return c; }
gavl_video_format_t * FifoVideoFrames::getFormat() { return format; };
float FifoVideoFrames::getSizePercentage() { float ret; pthread_mutex_lock(&mut);ret = count / (float) size; pthread_mutex_unlock (&mut); return ret;};
int FifoVideoFrames::getSize() { int ret; pthread_mutex_lock(&mut);ret = count; pthread_mutex_unlock (&mut); return ret;};
|