Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Zed_Blade

Problema código - Conversor CIF e QCIF

Recommended Posts

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á?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.