#include #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