1 |
/******************************************************************************* |
/******************************************************************************* |
2 |
* This file is a example for how to use the xvid core to compress YUV file |
* This file is a example for how to use the xvid core to compress YUV file |
3 |
* |
* |
4 |
* |
* 0.01b 28.05.2002 chenm001<chenm001@163.com> |
5 |
|
* fix a little bug for encode only codec I frame |
6 |
|
* 0.01a 27.05.2002 chenm001<chenm001@163.com> |
7 |
|
* fix a little bug for BFRAMES define locate |
8 |
* 0.01 23.05.2002 chenm001<chenm001@163.com> |
* 0.01 23.05.2002 chenm001<chenm001@163.com> |
9 |
* the BFRAME option must be match to core compile option |
* the BFRAME option must be match to core compile option |
10 |
*******************************************************************************/ |
*******************************************************************************/ |
11 |
|
|
12 |
|
//#define BFRAMES |
13 |
#include "ex1.h" |
#include "ex1.h" |
|
#define BFRAMES |
|
14 |
|
|
15 |
int Encode(char *, int, int, char *); |
int Encode(char *, int, int, char *); |
16 |
int Decode(char *, int, int, char *); |
int Decode(char *, int, int, char *); |
55 |
param->max_quantizer = 31; |
param->max_quantizer = 31; |
56 |
param->max_key_interval = 100; |
param->max_key_interval = 100; |
57 |
|
|
58 |
|
#ifdef BFRAMES |
59 |
param->max_bframes = 0; // Disable B-frame |
param->max_bframes = 0; // Disable B-frame |
60 |
|
#endif |
61 |
} |
} |
62 |
|
|
63 |
void set_enc_frame(XVID_ENC_FRAME *frame) |
void set_enc_frame(XVID_ENC_FRAME *frame) |
72 |
frame->colorspace = XVID_CSP_YV12; // the test.yuv format is YV12 |
frame->colorspace = XVID_CSP_YV12; // the test.yuv format is YV12 |
73 |
frame->quant = 0; // CBR mode |
frame->quant = 0; // CBR mode |
74 |
|
|
|
frame->general = 0; |
|
75 |
frame->general |= XVID_MPEGQUANT; // Use MPEG quant |
frame->general |= XVID_MPEGQUANT; // Use MPEG quant |
76 |
frame->quant_inter_matrix = NULL; // Use default quant matrix |
frame->quant_inter_matrix = NULL; // Use default quant matrix |
77 |
frame->quant_intra_matrix = NULL; |
frame->quant_intra_matrix = NULL; |
104 |
} |
} |
105 |
|
|
106 |
// get Xvid core status |
// get Xvid core status |
107 |
|
init_param.cpu_flags = 0; |
108 |
xvid_init(0, 0, &init_param, NULL); |
xvid_init(0, 0, &init_param, NULL); |
109 |
// Check API Version is 2.1? |
// Check API Version is 2.1? |
110 |
if (init_param.api_version != ((2<<16)|(1))) |
if (init_param.api_version != ((2<<16)|(1))) |
121 |
// Encode Frame |
// Encode Frame |
122 |
temp=fread(inBuf, 1, width*height*3/2, fpi); // Read YUV data |
temp=fread(inBuf, 1, width*height*3/2, fpi); // Read YUV data |
123 |
while(temp == width*height*3/2){ |
while(temp == width*height*3/2){ |
124 |
|
printf("Frames=%d\n",num); |
125 |
set_enc_frame(&frame); |
set_enc_frame(&frame); |
126 |
if (!(num%param.max_key_interval)) |
if (!(num%param.max_key_interval)) |
127 |
frame.intra = 1; // Encode as I-frame |
frame.intra = 1; // Encode as I-frame |
130 |
xvid_encore(param.handle, XVID_ENC_ENCODE, &frame, &stats); |
xvid_encore(param.handle, XVID_ENC_ENCODE, &frame, &stats); |
131 |
fwrite(outBuf, 1, frame.length, fpo); |
fwrite(outBuf, 1, frame.length, fpo); |
132 |
temp=fread(inBuf, 1, width*height*3/2, fpi); // Read next YUV data |
temp=fread(inBuf, 1, width*height*3/2, fpi); // Read next YUV data |
133 |
|
num++; |
134 |
} |
} |
135 |
|
|
136 |
// Free Encode Core |
// Free Encode Core |