Commit 63bebd14 authored by Francisco Cabrera Fernandez's avatar Francisco Cabrera Fernandez
Browse files

F

parent 0cb66ed3
......@@ -15,6 +15,16 @@ using namespace std;
#define MY_IP "127.0.0.1"
#define MAX_QUEUE 20
#define MAX_MSG_SIZE 65535
#define INACTIVO 0
#define INICIO 1
#define REPRODUCIR 2
#define PAUSA 3
#define FINALIZAR 4
#define SALIR 5
pthread_mutex_t mutex;
int main(void)
{
......@@ -33,7 +43,7 @@ int main(void)
bind(server_socketTCP, (struct sockaddr*)&server_addr, server_addr_size); // le fijo a ese skt, el ip y puerto mio, no a donde mando, no hay conexiones de nada aun.
//se le da identidad/ configura el skt servidor
int comunicacion[20]={0}; //para la comunicacion entre cada hilo de un cliente
int comunicacion[20]={INACTIVO}; //para la comunicacion entre cada hilo de un cliente
Mat frame; //array que representa los frames del video
......@@ -53,6 +63,9 @@ int main(void)
int id_libre = 0;
int id_cliente;
while (1) {
//primitiva ACCEPT
struct sockaddr_in client_addr;
......@@ -60,35 +73,29 @@ int main(void)
int socket_to_clientTCP = accept(server_socketTCP, (struct sockaddr *)&client_addr, &client_addr_size);
//abre conexion, si no hay nadie solicitando, me quedo aca bloqueado esperando
comunicacion[id_libre] = 1;
comunicacion[id_libre] = INICIO;
id_cliente=id_libre;
int i = 0;
bool encontre = false;
while ((i < 20) && !encontre){
if (comunicacion[i] == 0){
if (comunicacion[i] == INACTIVO){
id_libre = i;
encontre = true;
}
i++;
}
pthread_mutex_init(&mutex, NULL);
pthread_t hilo_control;
pthread_t hilo_stream;
pthread_create(&hilo_control, NULL, funcionTCP(id_cliente), NULL); //separo thread (idcliente, tcp)
pthread_create(&hilo_stream, NULL, funcionUDP(id_cliente), NULL);//separo thread (idcliente, udp)
repeat
listen tcp
if escucho == pausa
guardarContexto()
bloquear
enviarframe();
until termine
if (int pthread_create(&hilo_control, NULL, (void*)controlVideo(socket_to_clientTCP,id_cliente, comunicacion, frame, cap, encoded, client_addr, client_addr_size),
NULL) != 0) perror("No se pudo ejecutar el programa de control"); //separo thread (idcliente, tcp)
pthread_join(hilo_control, NULL);
//primitiva CLOSE
close(socket_to_clientTCP);
close(socket_to_clientTCP);
id_libre = id_cliente;
}
......@@ -96,3 +103,56 @@ int main(void)
close(server_socketTCP);
}//fin servidor
void controlVideo(int socket_to_clientTCP,int id_cliente, int &comunicacion[], Mat frame, VideoCapture cap, vector<uchar> encoded, sockaddr_in client_addr, socklen_t client_addr_size){
pthread_mutex_t pausa;
pthread_mutex_init(&pausa, NULL);
pthread_t hilo_stream;
if (int pthread_create(&hilo_stream, NULL, streamVideo(id_cliente, frame, cap, encoded, comunicacion, pausa, client_addr, client_addr_size), NULL) != 0) perror("No se pudo enviar el video");//separo thread (idcliente, udp)
pthread_join(hilo_stream, NULL);
}
void streamVideo(int id_cliente, Mat frame, VideoCapture cap, vector<uchar> encoded, int &comunicacion[], pthread_mutex_t &pausa, sockaddr_in client_addr, socklen_t client_addr_size){
//primitiva SOCKET
int socket_to_clientUDP = socket(PF_INET, SOCK_DGRAM, 0);
//primitiva BIND
bind(socket_to_clientUDP,(struct sockaddr*)&client_addr, client_addr_size);
pthread_mutex_lock(&mutex);
while (comunicacion[id_cliente] != SALIR) { //MIRAR ESTO PARA CORREGIR
pthread_mutex_unlock(&mutex);
int pthread_mutex_lock(&pausa);
int pthread_mutex_unlock(&pausa);
//pasar las frames
cap >> frame; //obtener nuevo frame
imshow("servidor", frame); //muestra la imagen en la ventana servidor
WaitKey(1000/30); //espera para ver las frames y que se reproduzca el video en el servidor
//convertir la imagen a texto para enviar
vector <int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(80);
imencode(".jpg", frame, encoded, compression_params);
//SEND
int sent_data_size = sendto(
socket_to_clientUDP,
encoded, encoded.size(), 0,
(struct sockaddr*)& client_addr, client_addr_size
);
}
pthread_mutex_unlock(&mutex); //ESTO PODRIA ESTAR MAL, NO NOS PUTEES CAMACHO, FELIZ CUMPLE :)
}
......@@ -19,10 +19,7 @@ int main(void)
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(MY_IP);
bind(
server_socket,
(struct sockaddr*)&server_addr, server_addr_size
);
bind(server_socket,(struct sockaddr*)&server_addr, server_addr_size);
while (1) {
//primitiva RECEIVE
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment