Home arrow Studies arrow Coding arrow CIF Video Format
CIF Video Format PDF Print

 
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;
}

 

 

Copyright 2003-2007 by Chasan Chouse.

Locations of visitors to this page