112 lines
2.3 KiB
C++
112 lines
2.3 KiB
C++
#include <stdint.h>
|
|
#include "X264.h"
|
|
#include "CODEC.h"
|
|
|
|
#ifdef CODEC_H264
|
|
|
|
extern "C"
|
|
{
|
|
void x264_ratecontrol_update(x264_t *h);
|
|
}
|
|
|
|
void *H264_Encode_INIT(MAP *PPicture)
|
|
{
|
|
x264_t *F;
|
|
x264_param_t param ;
|
|
memset(¶m,0,sizeof(param));
|
|
x264_param_default( ¶m );
|
|
param.rc.i_qp_min = 10;
|
|
param.rc.i_qp_max = 51;
|
|
//*/
|
|
param.i_width = PPicture->SX;
|
|
param.i_height = PPicture->SY;
|
|
F = x264_encoder_open ( ¶m);
|
|
return (void *)F;
|
|
}
|
|
|
|
u32 H264_Encode_FRAME(void *H,MAP *PPicture,char *Buffer,u32 FROMSCRATCH)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
static MAP PreviousMAP = {NULL,NULL,0,0,0};
|
|
static x264_picture_t pic_In;
|
|
x264_picture_t *pic_Current;
|
|
x264_t *h264;
|
|
u32 LocalBufferSize;
|
|
x264_picture_t pic_out;
|
|
x264_nal_t *nal;
|
|
int i_nal, i;
|
|
int i_file = 0;
|
|
int i_size;
|
|
int i_data;
|
|
int FrmaeNum = 0;
|
|
BOOL b_WriteData = 0;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
h264 = (x264_t*)H;
|
|
if ((PreviousMAP.SX != PPicture->SX) || (PreviousMAP.SY != PPicture->SY) || (PreviousMAP.PITCH != PPicture->PITCH))
|
|
{
|
|
if (PreviousMAP.SX != 0)
|
|
x264_picture_clean(&pic_In);
|
|
x264_picture_alloc(&pic_In, X264_CSP_BGRA, PPicture->SX, PPicture->SY);
|
|
}
|
|
PreviousMAP = *PPicture;
|
|
|
|
memcpy(pic_In.img.plane[0], (char*)PPicture->BASE, PPicture->SX * PPicture->SY * 4);
|
|
|
|
pic_In.i_pts = (int64_t) FrmaeNum ++;
|
|
if (FROMSCRATCH)
|
|
pic_In.i_type = X264_TYPE_IDR;
|
|
else
|
|
pic_In.i_type = X264_TYPE_AUTO;
|
|
pic_In.i_qpplus1 = 0;
|
|
|
|
LocalBufferSize = 0;
|
|
pic_Current = &pic_In ;
|
|
do
|
|
{
|
|
if(x264_encoder_encode(h264, &nal, &i_nal, pic_Current , &pic_out) < 0)
|
|
*(u32 *)0 = *(u32 *)4; // <- breakpoint
|
|
|
|
b_WriteData = 0;
|
|
i_size = 0;
|
|
|
|
for(i = 0; i < i_nal; i++)
|
|
{
|
|
i_data = DATA_MAX;
|
|
if((i_size = x264_nal_encode(&Buffer[LocalBufferSize], &i_data, 1, &nal[i])) > 0)
|
|
{
|
|
LocalBufferSize += i_size;
|
|
i_file += i_size;
|
|
}
|
|
else if(i_size < 0)
|
|
{
|
|
*(u32 *)0 = *(u32 *)4;// <- Please crash.
|
|
}
|
|
}
|
|
pic_Current = NULL;
|
|
}
|
|
while (i_size);
|
|
return LocalBufferSize;
|
|
}
|
|
|
|
void H264_Encode_CLOSE(void *H)
|
|
{
|
|
x264_encoder_close ( (x264_t *)H );
|
|
}
|
|
|
|
void *Encode_INIT(MAP *PPicture)
|
|
{
|
|
return H264_Encode_INIT(PPicture);
|
|
}
|
|
|
|
u32 Encode_FRAME(void *H, MAP *PPicture, char *Buffer, u32 FROMSCRATCH, u32 Q, u32 R)
|
|
{
|
|
return H264_Encode_FRAME(H, PPicture, Buffer, FROMSCRATCH);
|
|
}
|
|
|
|
void Encode_CLOSE(void *H)
|
|
{
|
|
H264_Encode_CLOSE(H);
|
|
}
|
|
|
|
|
|
#endif
|