JD2022-TU1/main/extern/Camcam/LIBS/X264 - Lib/H264_Encoder.cpp

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(&param,0,sizeof(param));
x264_param_default( &param );
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 ( &param);
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