ezMPEG API Documentation

1. Introduction
  1.1 Features
  1.2 Missing Features / ToDo
  1.3 Known Bugs
2. ezMPEG API
  2.1 Main data structure
    2.1.1 ezMPEGStream
  2.2 Generating a MPEG video stream
    2.2.1 ezMPEG_Init(...)
    2.2.2 ezMPEG_Start(...)
    2.2.3 ezMPEG_Add(...)
    2.2.4 ezMPEG_Finalize(...)
  2.3 Error handling
    2.3.1 ezMPEG_GetLastError(...)
  2.4 Tools
    2.4.1 ezMPEG_Resize(...)
3. Example
4. How to compile
5. Legal


1. Introduction

ezMPEG is an easy-to-use and easy-to-understand MPEG1 video encoder API. I started this project because I wanted to know how MPEG works and the best way to learn it is to implement my own encoder. So I downloaded the ISO specs and began to read and code. My implementation doesn't have the goal to be better than all the others. The goal is to have a simple, portable and esay to understand code for all the people (and for me) who wants to know how a MPEG1 video encoder works.

1.1 Features

- based on ISO-11172.2 Specs
- I frame encoding
- GOP size can be defined
- quality settings can be defined
- multiple parallel streams
- variable bitrate
- some more I forgot

1.2 Missing Features / ToDo

- implement P and B frames
- constant bitrate
- better data structures (especially for images)
- some optimizations
- ...

1.3 Known Bugs

Nothing found till now :)


2. ezMPEG API

This chapter explains how the API works and what is needed to make it work.

2.1 Main data structure

2.1.1 ezMPEGStream

The structure ezMPEGStream contains all the needed information for the current MPEG stream.
typedef struct ezMPEGStream {
	char *outfile;			// name of the resulting MPEG file
	FILE *out;			// filehandler for the outfile
	int hsize;			// height in macroblocks
	int vsize;			// width in macroblocks
	int picture_rate;		// how many pictures per sec
	int gop_size;			// how many pictures per GOP
	int dc_prev[3];			// storage for the dc-coefficients
	double q_scale;			// scaling factor (quality setting)

	// settings for the output buffer
	int picture_count;
	int buffersize;
	int buffercount;
	char *buffer;
	int buf;
	int pos;

	short error_code;
	char error_msg[256];
} ezMPEGStream;
There is no need to change the entries of ezMPEGStream by hand. They've get all initialized by ezMPEG_Init(...) (see section 2.2.1)

2.2 Generating a MPEG video stream

This section will explain the functions needed to encode a MPEG video. Please see the example in section 3 to see how to use the following functions in your code.

2.2.1 ezMPEG_Init(...)

This function initializes an instance of ezMPEGStream. It returns 0 (zero) if something went wrong.
int ezMPEG_Init(ezMPEGStream *ms,		// ms is an instance of ezMPEGStream
                const char *outfile,		// name of the resulting MPEG file
                int hsize,			// height of the video in pixel
                int vsize,			// width of the video in pixel
                int picture_rate,		// how many pictures per sec (currently 25 is possible)
                int gop_size,			// how many pictures per GOP
                int q_scale			// quality setting, 1 (high quality) to 31 (low quality)
               );
2.2.2 ezMPEG_Start(...)

This function starts the MPEG stream, will say it opens the outfile and initilizes the buffer. It returns 0 (zero) if something went wrong.
int ezMPEG_Start(ezMPEGStream *ms);
2.2.3 ezMPEG_Add(...)

This function adds a picture to the MPEG stream defined by the given instance of ezMPEGStream. It returns 0 (zero) if something went wrong.
int ezMPEG_Add(ezMPEGStream *ms,
               unsigned char *picture
              );
The pointer to the picture must point to an array of unsigned chars containing for every pixel three chars for red, green and blue. It looks like this:

picture[0] = R0, picture[1] = G0, picture[2] = B0, picture[3] = R1, ....
where R0 is the red value of the first pixel, G0 is the green value of the first pixel and so on

2.2.4 ezMPEG_Finalize(...)

This function closes the MPEG stream defined by the given instance of ezMPEGStream. It returns 0 (zero) if something went wrong.
int ezMPEG_Finalize(ezMPEGStream *ms);
After applying this function it is not possible to add any more pictures to this stream.

2.3 Error handling

This section explains how the error handling works

2.3.1 ezMPEG_GetLastError(...)

This function will return a string containing the last error message generated by a function of the API.
char *ezMPEG_GetLastError(ezMPEGStream *ms);
2.4 Tools

This section will give an overview of the current available tools for ezMPEG

2.4.1 ezMPEG_Resize(...)

This function resizes a picture to a given size.
void ezMPEG_Resize(ezMPEGStream *ms,		// ms is an instance of ezMPEGStream
                   unsigned char *outbild,	// pointer to an array containing the resized picture
                   unsigned char *inbild,	// pointer to an array containing the picture to be reiszed
                   int x,			// height of the original picture
                   int y,			// width of the original picture
                   int u,			// height of the resized picture
                   int v			// widht of the resized picture
                  );
The resizing algorithm ist quite simple. So don't expect good results.

3. Example

This chapter explains the example code how to use the ezMPEG API. It is based on the example you find in the 'example' directory in this release.

This example code will encode one picture to measure the duration of the encoding process. The parts specific for ezMPEG are bold.
// First we must include some header files

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

// Then include 'ezmpeg.h' to have access to the API

#include "../ezmpeg.h"

// Main
int main(int argc, char *argv[])
{
	FILE *in;
	int i, j, m;

	// pointer to an array which holds the image
	unsigned char *picture;

	clock_t dur;

	// create an instance of ezMPEGStream
	ezMPEGStream ms;

	// allocate memory for the picture
	picture = (unsigned char *)malloc(3 * 320 * 240 * sizeof(char));

	// here we initialize our instance of ezMPEGStream
	// the output filename is 'ezmpeg_test.mpeg'
	// height = 320
	// width = 240
	// picture rate = 25
	// GOP size = 30
	// quality = 2 (good quality)

	// and we can see the usage of the error handling function

	if(!ezMPEG_Init(&ms, "ezmpeg_test.mpeg", 320, 240, 25, 30, 2))
		printf("%s\n", ezMPEG_GetLastError(&ms));

	// here we start the MPEG stream

	if(!ezMPEG_Start(&ms))
		printf("%s\n", ezMPEG_GetLastError(&ms));

	// in this loop we encode the same picture 75 times
	for(m = 0; m < 75; m++) {

		// read in the picture
		if((in = fopen("ezmpeg_test.ppm", "rb")) == NULL)
			exit(1);

		fseek(in, 45, SEEK_SET);
		j = 0;
		do {
			i = fgetc(in);

			if(i != EOF)
				picture[j++] = i;
			else
				break;
		}while(i != EOF);

		fclose(in);

		// take the starting time
		dur = clock();

		// add the picture to the stream defind by 'ms'
		if(!ezMPEG_Add(&ms, picture))
			printf("%s\n", ezMPEG_GetLastError(&ms));

		// take the time again
		dur = clock() - dur;

		// print out the encoding time
		printf("Frame %4d: %f secs\n", m, (float)dur / (float)CLOCKS_PER_SEC);
	}

	// finally close the the MPEG stream
	if(!ezMPEG_Finalize(&ms))
		printf("%s\n", ezMPEG_GetLastError(&ms));

	// return to the shell
	return 0;
}
4. How to compile

This section will explain how to compile your code.

To compile the example from chapter 3 which can be found in the 'example' directory in this release just chdir to the mentioned directory. Then type (if you use gcc)
gcc ezmpeg_example.c ../ezmpeg.c -o ezmpeg_example -lm
This should compile the code. After that you can execute 'ezmpeg_example' and it will create a MPEG video.

5. Legal

ezMPEG Copyright ©2002 Ingo Oppermann (ingo_opp@users.sourceforge.net)

\EOF

SourceForge Logo