aboutsummaryrefslogtreecommitdiff
path: root/src/FifoVideoFrames.cpp
blob: 29975dc84715898e02e0c30ead12c0e8b378b037 (plain)
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;};