Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Zed_Blade

Problema código - Conversor CIF e QCIF

Mensagens Recomendadas

Zed_Blade

Boas,

Pessoal tenho aqui código para um conversor de ficheiro para cif e qcif, e há certas coisas que não me estão a funcionar, mas o meu C está muitissimo enferrujado.

Para já os códigos de erro que obtenho são os seguintes:

main.c:3:18: error: conio.h: No such file or directory

main.c: In function ‘main’:

main.c:32: error: case label does not reduce to an integer constant

main.c:33: error: expected expression before ‘char’

main.c:33: error: too few arguments to function ‘qcif’

main.c:35: error: case label does not reduce to an integer constant

main.c:36: error: expected expression before ‘char’

main.c:36: error: too few arguments to function ‘cif’

main.c: At top level:

main.c:48: error: conflicting types for ‘select_file’

main.c:16: error: previous declaration of ‘select_file’ was here

main.c: In function ‘select_file’:

main.c:54: error: invalid initializer

main.c:56: warning: incompatible implicit declaration of built-in function ‘strncpy’

main.c: At top level:

main.c:214: error: redefinition of ‘qcif’

main.c:74: error: previous definition of ‘qcif’ was here

Tem estes erros todos porque entretanto andei a fazer montes de alterações.

Relativamente ao código, o mesmo encontra-se aqui:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

//http://trace.eas.asu.edu/yuv/index.html

//Apresentar menu
	//Receber nome ficheiro
	//guarda em nome_ficheiro
//Saber numero de frames
	//guardar em variável
//Apresentar opção de encoding
	//Case: Q -> função QCIF(nome_ficheiro, n_frames);
	//Case: C -> função CIF(nome_ficheiro, n_frames);

void select_file();
int select_frames();
void qcif(char *nome_ficheiro, int n_frames);
void cif(char *nome_ficheiro, int n_frames);



int main ()
{
char opt;
int n_frames = 0;
     
select_file();
select_frames();

switch (opt) {
	case (opt == 'Q'):
		qcif(char *nome_ficheiro, int n_frames);
		break;
	case (opt == 'C'):
		cif(char *nome_ficheiro, int n_frames);
		break;
	default:
		printf("Nada a fazer. Vou terminar\n");
		break;
}

    return 0;
}

// ############# Funções ##############

char* select_file(){

printf("Indique qual o nome do ficheiro: \n");

//alocar memória para a string com nome do ficheiro
char *nome_ficheiro = (char *) malloc(sizeof(char)); 

//colocar no vector o nome lido do teclado
char str[] = scanf("%s", &*str);

//copiar o valor lido do teclado para a memória alocada para o nome de ficheiro
strncpy(nome_ficheiro, str ,sizeof(nome_ficheiro));

//devolver o nome de ficheiro
return nome_ficheiro;
}

int select_frames()
{
int n_frames;

printf("Qual o numero de frames: \n");
scanf("%d", &n_frames);

return n_frames;
}


/* ################## Função para QCIF ########################### */
void qcif(char *nome_ficheiro, int n_frames)
{
int n, j;
int k = 0;
//char nome_file[] = "coastguard_qcif.yuv";
int xsize = 352;
int ysize = 288;
unsigned char *buffer_y, *buffer_u, *buffer_v;
unsigned char *buffer_ynew, *buffer_unew, *buffer_vnew;
    
FILE *fp;
FILE *fw;
FILE *fp1;

fp = fopen(nome_ficheiro,"rb");
fw = fopen("base_layer.yuv","wb");
fp1 = fopen("enhancement_layer.yuv","wb");


if(fp==NULL)
{
        printf("Impossivel abrir o ficheiro!\n"); 
        getch();
        exit(0);
}     
    
do{ 

	buffer_y = (unsigned char*) malloc (xsize * ysize);
	buffer_u = (unsigned char*) malloc ((xsize * ysize)/4);
	buffer_v = (unsigned char*) malloc ((xsize * ysize)/4);

	buffer_ynew = (unsigned char*) malloc (xsize * ysize);
	buffer_unew = (unsigned char*) malloc ((xsize * ysize)/4);
	buffer_vnew = (unsigned char*) malloc ((xsize * ysize)/4);


	n = fread (buffer_y, sizeof(char), (xsize*ysize), fp);
	if(n==0)
	{
		printf("Nao foi possivel ler o ficheiro");
		return;
	} 

	n = fread (buffer_u, sizeof(char), ((xsize*ysize)/4), fp);
	if(n!=(xsize*ysize)/4)
	{
		printf("Nao foi encontrado o ficheiro!");
		return;
	} 

	n = fread (buffer_v, sizeof(char), ((xsize*ysize)/4), fp);
	if(n!=(xsize*ysize)/4)
	{
		printf("Nao foi encontrado o ficheiro!");
		return;
	} 
	//fclose(fp);

	//***************Truncar bits para base layer****************************************************

	for (j=0; j<(xsize * ysize); j++){
		buffer_y[j] = buffer_y[j]/16;
		buffer_y[j] = buffer_y[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_u[j] = buffer_u[j]/16;
		buffer_u[j] = buffer_u[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_v[j] = buffer_v[j]/16;
		buffer_v[j] = buffer_v[j]*16;
	}

	//***************Voltar abrir um ficheiro mas em modo de gravação para base layer*************** 

	if(fw==NULL)
	{
		printf("Não foi possivel criar o ficheiro!");
		getch();
		exit(0);
	}       

	fwrite(buffer_y, (xsize*ysize), sizeof(char), fw);
	fwrite(buffer_u, ((xsize*ysize)/4), sizeof(char), fw);
	fwrite(buffer_v, ((xsize*ysize)/4), sizeof(char), fw);    

	//***************Efectuar o decoding, multiplicando por 16****************************************

	for (j=0; j<(xsize * ysize); j++){
		buffer_y[j] = buffer_y[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_u[j] = buffer_u[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_v[j] = buffer_v[j]*16;
	}

	//***************Voltar abrir um ficheiro em modo de gravação para enhancement layer************* 

	if(fp1==NULL)
	{
		printf("Nao foi possivel criar o ficheiro!");
		getch();
		exit(0);
	}       

	fwrite(buffer_ynew, (xsize*ysize), sizeof(char), fp1);
	fwrite(buffer_unew, ((xsize*ysize)/4), sizeof(char), fp1);
	fwrite(buffer_vnew, ((xsize*ysize)/4), sizeof(char), fp1); 

	//***************Subtraccao para enhancement layer***********************************************   

	for (j=0; j<(xsize * ysize); j++){
		buffer_ynew[j] = buffer_y[j]- buffer_ynew[j];
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_unew[j] = buffer_u[j]- buffer_unew[j];
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_vnew[j] = buffer_v[j]- buffer_vnew[j];
	}  

	k++; 

}
while (k <= n_frames);
}

/* ################ END QCIF ###################### */


/* ############### Função para CIF ################ */
void qcif(char *nome_ficheiro, int n_frames)
{
int n, j;
int k = 0;
//char nome_file[] = "coastguard_qcif.yuv";
int xsize = 176;
int ysize = 144;
unsigned char *buffer_y, *buffer_u, *buffer_v;
unsigned char *buffer_ynew, *buffer_unew, *buffer_vnew;
    
FILE *fp;
FILE *fw;
FILE *fp1;

fp = fopen(nome_ficheiro,"rb");
fw = fopen("base_layer.yuv","wb");
fp1 = fopen("enhancement_layer.yuv","wb");


if(fp==NULL)
{
        printf("Impossivel abrir o ficheiro!\n"); 
        getch();
        exit(0);
}     
    
do{ 

	buffer_y = (unsigned char*) malloc (xsize * ysize);
	buffer_u = (unsigned char*) malloc ((xsize * ysize)/4);
	buffer_v = (unsigned char*) malloc ((xsize * ysize)/4);

	buffer_ynew = (unsigned char*) malloc (xsize * ysize);
	buffer_unew = (unsigned char*) malloc ((xsize * ysize)/4);
	buffer_vnew = (unsigned char*) malloc ((xsize * ysize)/4);


	n = fread (buffer_y, sizeof(char), (xsize*ysize), fp);
	if(n==0)
	{
		printf("Nao foi possivel ler o ficheiro");
		return;
	} 

	n = fread (buffer_u, sizeof(char), ((xsize*ysize)/4), fp);
	if(n!=(xsize*ysize)/4)
	{
		printf("Nao foi encontrado o ficheiro!");
		return;
	} 

	n = fread (buffer_v, sizeof(char), ((xsize*ysize)/4), fp);
	if(n!=(xsize*ysize)/4)
	{
		printf("Nao foi encontrado o ficheiro!");
		return;
	} 
	//fclose(fp);

	//***************Truncar bits para base layer****************************************************

	for (j=0; j<(xsize * ysize); j++){
		buffer_y[j] = buffer_y[j]/16;
		buffer_y[j] = buffer_y[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_u[j] = buffer_u[j]/16;
		buffer_u[j] = buffer_u[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_v[j] = buffer_v[j]/16;
		buffer_v[j] = buffer_v[j]*16;
	}

	//***************Voltar abrir um ficheiro mas em modo de gravação para base layer*************** 

	if(fw==NULL)
	{
		printf("Nao foi possivel criar o ficheiro!");
		getch();
		exit(0);
	}       

	fwrite(buffer_y, (xsize*ysize), sizeof(char), fw);
	fwrite(buffer_u, ((xsize*ysize)/4), sizeof(char), fw);
	fwrite(buffer_v, ((xsize*ysize)/4), sizeof(char), fw);    

	//***************Efectuar o decoding, multiplicando por 16****************************************

	for (j=0; j<(xsize * ysize); j++){
		buffer_y[j] = buffer_y[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_u[j] = buffer_u[j]*16;
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_v[j] = buffer_v[j]*16;
	}

	//***************Voltar abrir um ficheiro em modo de gravação para enhancement layer************* 

	if(fp1==NULL)
	{
		printf("Nao foi possivel criar o ficheiro!");
		getch();
		exit(0);
	}       

	fwrite(buffer_ynew, (xsize*ysize), sizeof(char), fp1);
	fwrite(buffer_unew, ((xsize*ysize)/4), sizeof(char), fp1);
	fwrite(buffer_vnew, ((xsize*ysize)/4), sizeof(char), fp1); 

	//***************Subtraccao para enhancement layer***********************************************   

	for (j=0; j<(xsize * ysize); j++){
		buffer_ynew[j] = buffer_y[j]- buffer_ynew[j];
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_unew[j] = buffer_u[j]- buffer_unew[j];
	}

	for (j=0; j<((xsize * ysize)/4); j++){
		buffer_vnew[j] = buffer_v[j]- buffer_vnew[j];
	}  

	k++; 

}
while (k <= n_frames);
}

/* #################### END CIF ################### */


Há também uma coisa que me tenho questionado: É melhor usar uma estrutura para guardar o nº de frames e o nome do ficheiro ou posso manter como está?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.