|
This is the simplest video file format in YUV color space. The size of this format is static(352x288). It is also a 4:2:2 YUV format. So Y, U and V matrices are not same. YUV order is as follows:
CIF Read and Write Source Code in C
For memory allocation see Dynamic Memory Allocation page.
/* Y: 352x288 U: 176x144 V: 176x144
If you want to use CIF format, you will need to convert to RGB. Below you can find the conversion source code.
This is the simplest video file format in YUV color space. The size of this format is static(352x288). It is also a 4:2:2 YUV format. So Y, U and V matrices are not same. YUV order is as follows:
* Give a reference to this site if you like to use this code. * * Written by Chasan Chouse, 2004 */ /* Returns number of frames */ long CIF_Get_Frame_Info(char FileName[]) { long szf; FILE *f;
f = fopen(FileName, "rb"); szf = filesize(f); fclose(f); return (szf / 152064); // one frame=152064 } /* CIF format is 352x288 YUV order is as follows: Y: 352x288 U: 176x144 V: 176x144 New order will be Y: 352x288 U: 352x288 V: 352x288
No Header or other info.
*/ int CIF_Read_Data(char FileName[], long FrameNo, UCHAR **Y, // Y must be 352x288 UCHAR **U, // U must be 352x288 UCHAR **V) // V must be 352x288 { long i, j, szf, NofFrames; long szOneFrame = 152064; // Y:352x288, U:176x144, V:176x144 UCHAR pix; FILE *f;
f = fopen(FileName, "rb"); szf = filesize(f); NofFrames = szf / szOneFrame; if (FrameNo >= NofFrames) { printf("ERROR! Frame number must be between %ls and %ld.", 0, NofFrames-1); return false; } fseek(f, szOneFrame*FrameNo, SEEK_SET); /*Read Y values*/ for(i=0;i<288;i++) { for(j=0;j<352;j++) { Y[i][j] = (UCHAR)fgetc(f); } } /*Read U values and expand them*/ for(i=0;i<144;i++) { for(j=0;j<176;j++) { pix = (UCHAR)fgetc(f); U[i<<1][j<<1] = pix; // 0,0 U[i<<1][(j<<1)+1] = pix; // 0,1 U[(i<<1)+1][j<<1] = pix; // 1,0 U[(i<<1)+1][(j<<1)+1] = pix;// 1,1 } } /*Read V values and expand them*/ for(i=0;i<144;i++) { for(j=0;j<176;j++) { pix = (UCHAR)fgetc(f); V[i<<1][j<<1] = pix; // 0,0 V[i<<1][(j<<1)+1] = pix; // 0,1 V[(i<<1)+1][j<<1] = pix; // 1,0 V[(i<<1)+1][(j<<1)+1] = pix;// 1,1 } } fclose(f); return false; } /* If the it's the first frame file must be created. Other frames will be appended. /* int CIF_Write_Data(char FileName[], int mode, // 0: first frame 1: next frames, append UCHAR **Y, // Y must be 352x288 UCHAR **U, // U must be 352x288 UCHAR **V) // V must be 352x288 { long i, j; long szOneFrame = 152064; // Y:352x288, U:176x144, V:176x144 UCHAR pix; FILE *f;
if (mode == 0) // file will be created { if( (f = fopen(FileName, "rb+")) ) // check if file exists { fclose(f); DispError("ERROR! File exists\n"); return false; } else // OK! Create the file f = fopen(FileName, "wb"); } else // append { f = fopen(FileName, "rb+"); fseek(f, 0L, SEEK_END); } /*Write Y values*/ for(i=0;i<288;i++) { for(j=0;j<352;j++) { fputc((int)Y[i][j], f); } } /*Write U values*/ for(i=0;i<144;i++) { for(j=0;j<176;j++) { /*Average of four pixel values will be written as U*/ pix = U[i<<1][j<<1]; pix += U[i<<1][(j<<1)+1]; pix += U[(i<<1)+1][j<<1]; pix += U[(i<<1)+1][(j<<1)+1]; pix = pix >> 2; // pix/4 fputc(pix, f); } } /*Write V values*/ for(i=0;i<144;i++) { for(j=0;j<176;j++) { /*Average of four pixel values will be written as V*/ pix = V[i<<1][j<<1]; pix += V[i<<1][(j<<1)+1]; pix += V[(i<<1)+1][j<<1]; pix += V[(i<<1)+1][(j<<1)+1]; pix = pix >> 2; // pix/4 fputc(pix, f); } }
fclose(f); return false; }
|