39
39
#include "ADM_encoder/adm_encoder.h"
40
40
#include "ADM_encoder/adm_encx264.h"
41
#include "ADM_toolkit/ADM_cpuCap.h"
43
44
#define aprintf printf
46
47
/*_________________________________________________*/
47
EncoderX264::EncoderX264 (COMPRES_PARAMS *codecconfig)
48
EncoderX264::EncoderX264 (COMPRES_PARAMS * codecconfig)
51
52
strcpy (_logname, "");
54
memcpy(&_param,codecconfig,sizeof(_param));
55
ADM_assert(codecconfig->extraSettingsLen==sizeof(_codecParam));
56
memcpy(&_codecParam,(codecconfig->extraSettings),sizeof(_codecParam));
55
memcpy (&_param, codecconfig, sizeof (_param));
56
ADM_assert (codecconfig->extraSettingsLen == sizeof (_codecParam));
57
memcpy (&_codecParam, (codecconfig->extraSettings), sizeof (_codecParam));
58
_codecParam.nbThreads = ADM_useNbThreads ();
60
62
EncoderX264::~EncoderX264 ()
69
EncoderX264::hasExtraHeaderData (uint32_t * l, uint8_t ** data)
72
r = _codec->getExtraData (l, data);
73
printf ("x264 has %d extra bytes\n", *l);
66
77
//--------------------------------
67
uint8_t EncoderX264::configure (AVDMGenericVideoStream * instream)
79
EncoderX264::configure (AVDMGenericVideoStream * instream)
69
81
ADM_assert (instream);
76
_vbuffer=new ADMImage(_w,_h);
88
_vbuffer = new ADMImage (_w, _h);
77
89
ADM_assert (_vbuffer);
79
_fps1000=info->fps1000;
84
printf("\n X264 cq mode: %ld",_param.qz);
86
_codec = new X264EncoderCQ (_w, _h);
88
if(!_codec->init(_param.qz,info->fps1000,&_codecParam))
90
printf("Error initi X264 CQ mode\n");
95
printf("\n X264 cbr mode: %lu",_param.bitrate);
98
_codec = new X264EncoderCBR (_w, _h);
99
if(!_codec->init(_param.bitrate,info->fps1000,&_codecParam))
101
printf("Error initi X264 CBR mode\n");
106
// printf("\n X264 dual size: %lu (%s)\n",_param.finalsize,_logname);
108
_codec = new X264EncoderPass2 (_w, _h);
109
//strcpy(encparam.logName,_logname);
110
//printf("Using %s as stat file\n",encparam.logName);
91
_fps1000 = info->fps1000;
96
printf ("\n X264 cq mode: %ld", _param.qz);
98
_codec = new X264EncoderCQ (_w, _h);
100
if (!_codec->init (_param.qz, info->fps1000, &_codecParam))
102
printf ("Error initi X264 CQ mode\n");
107
printf ("\n X264 AQ mode: %ld", _param.qz);
109
_codec = new X264EncoderAQ (_w, _h);
111
if (!_codec->init (_param.qz, info->fps1000, &_codecParam))
113
printf ("Error initi X264 AQ mode\n");
118
printf ("\n X264 cbr mode: %lu", _param.bitrate);
121
_codec = new X264EncoderCBR (_w, _h);
122
if (!_codec->init (_param.bitrate, info->fps1000, &_codecParam))
124
printf ("Error initi X264 CBR mode\n");
129
case COMPRESS_2PASS_BITRATE:
130
// printf("\n X264 dual size: %lu (%s)\n",_param.finalsize,_logname);
132
_codec = new X264EncoderPass1 (_w, _h);
133
_codecParam.logfile = _logfile;
134
//strcpy(encparam.logName,_logname);
135
//printf("Using %s as stat file\n",encparam.logName);
118
143
printf ("\n X264 Encoder ready , w: %lu h:%lu mode:%d", _w, _h, _state);
125
uint8_t EncoderX264::startPass1 (void)
151
EncoderX264::startPass1 (void)
128
154
ADM_assert (_state == enc_Pass1);
129
info= _in->getInfo ();
130
if(!_codec->init(_param.bitrate,info->fps1000,&(_codecParam)))
132
printf("Error initi Xvid4 pass1 mode\n");
155
info = _in->getInfo ();
156
if (!_codec->init (_param.bitrate, info->fps1000, &(_codecParam)))
158
printf ("Error initi Xvid4 pass1 mode\n");
140
uint8_t EncoderX264::isDualPass (void)
167
EncoderX264::isDualPass (void)
143
170
if ((_state == enc_Pass1) || (_state == enc_Pass2))
151
uint8_t EncoderX264::setLogFile (const char *lofile, uint32_t nbframe)
179
EncoderX264::setLogFile (const char *lofile, uint32_t nbframe)
153
// strcpy (_logname, lofile);
181
// strcpy (_logname, lofile);
182
_logfile = ADM_strdup (lofile);
183
printf ("Enc X264, using %s as logfile\n", _logfile);
154
184
_frametogo = nbframe;
155
_totalframe= nbframe;
185
_totalframe = nbframe;
160
189
//______________________________
162
EncoderX264::encode (uint32_t frame, uint32_t * len, uint8_t * out,
191
EncoderX264::encode (uint32_t frame, ADMBitstream *out)
166
195
//ENC_RESULT enc;
168
197
ADM_assert (_codec);
169
198
ADM_assert (_in);
171
200
if (!_in->getFrameNumberNoAlloc (frame, &l, _vbuffer, &f))
173
printf ("\n Error : Cannot read incoming frame !");
202
printf ("\n Error : Cannot read incoming frame !");
177
// return _codec->encode (_vbuffer, out, len, flags);
206
// return _codec->encode (_vbuffer, out, len, flags);
186
return _codec->encode (_vbuffer, out, len, flags);
215
r = _codec->encode (_vbuffer, out );
197
227
//_______________________________
199
EncoderX264::stop (void)
228
uint8_t EncoderX264::stop (void)
201
if(_codec) delete _codec;
209
EncoderX264::startPass2 (void)
241
uint32_t ADM_computeBitrate(uint32_t fps1000, uint32_t nbFrame, uint32_t sizeInMB);
242
uint8_t EncoderX264::startPass2 (void)
214
247
ADM_assert (_state == enc_Pass1);
215
printf ("\n Starting pass 2 (%dx%d)\n",_w,_h);
218
finalSize=_param.finalsize;
224
br=br/ _totalframe; // bit / frame
228
finalSize= (int)floor(br);
248
printf ("\n Starting pass 2 (%dx%d)\n", _w, _h);
253
if(_param.mode==COMPRESS_2PASS)
255
bitrate=ADM_computeBitrate(_fps1000, _totalframe, _param.finalsize);
256
printf("[x264] Size %u, average bitrate %u kb/s\n",_param.finalsize,bitrate);
257
}else if(_param.mode==COMPRESS_2PASS_BITRATE)
259
bitrate=_param.avg_bitrate*1000;
260
printf("[x264] Average bitrate %u kb/s\n",bitrate);
230
263
_state = enc_Pass2;
231
// Delete codec and start new one
264
// Delete codec and start new one
237
printf("\n X264 dual size: %lu MB\n",_param.finalsize);
271
printf ("\n X264 dual size: %lu MB\n", _param.finalsize);
239
273
_codec = new X264EncoderPass2 (_w, _h);
240
// strcpy(encparam.logName,_logname);
274
// strcpy(encparam.logName,_logname);
241
275
//printf("Using %s as stat file, average bitrate %d kbps\n",_logname,finalSize/1000);
242
if(!_codec->init((uint32_t )br,_fps1000,&_codecParam))
244
printf("Error initializing x264 pass1 mode\n");
276
if (!_codec->init (bitrate, _fps1000, &_codecParam))
278
printf ("Error initializing x264 pass1 mode\n");