第二次编码就会出错
首先将数据考入到编码器缓存中
使用的一个IppPicture
IppBitstream 编码后的数据
struct vrec_encoder_data_h264
{
void *pEncoderState;
H264EncoderCBTable *pCBTable;
H264NALUnitList *pNALUList;
IppPicture *pPic; /* User Interface to the working buffer */
H264EncoderParSet *pParSet;
IppBitstream *pBufOut; // Output buffer
}
vrec_h264_encoder_private;
怎么对上面的结构体进行设置的?
pH264EncoderState
编码状态
InitCallbackTable_H264
初始化回调函数表
获取到的这个YUV数据结构体
struct av_frame
{
sem_t f_lock;
void * frame;
ts_t ts;
size_t size;
};
采集线程存放的YUV数据和编码取的线程是否一致?
这个buffer释放的有没有问题?
写都没问题,读也应该没有问题
怎么考的数据源?
编码的输入源还是这样一个结构体
/* Used for YCrCb data, it is stored in three areas */
struct v_frame
{
int index;
int height;
int width;
void * start[3]; //yuv data
size_t length[3];
};
struct av_frame
{
sem_t f_lock;
void * frame;
ts_t ts;
size_t size;
};
注意这样一个结构体
#define AVFRM_OBJ_NEW(prt) (((AV_FRAME *)(prt))->frame = ((prt) + sizeof(AV_FRAME)), /
((AV_FRAME *)(prt)))
#define VFRM_OBJ_NEW(p, w, h) (((V_FRAME *)(p))->start[0] = ((p) + sizeof(V_FRAME)), /
((V_FRAME *)(p))->length[0] = (w)*(h), /
((V_FRAME *)(p))->start[1] = ((V_FRAME *)(p))->start[0] + (BLKZ((w)*(h), 4096) * 4096), /
((V_FRAME *)(p))->length[1] = (w)*(h) / 4, /
((V_FRAME *)(p))->start[2] = ((V_FRAME *)(p))->start[1] + (BLKZ((w)*(h)/4, 4096) * 4096), /
((V_FRAME *)(p))->length[2] = (w)*(h) / 4, /
((V_FRAME *)(p)))
结构体的处理手法
注意到这些buffer的大小 0x70000
跟输入buffer没有关系
测试跟输出buffer有关系没?
IppBitstream
#define STRM_OBJ_NEW(prt) (((IppBitstream *)(prt))->pBsBuffer = ((prt) + sizeof(IppBitstream)), /
((IppBitstream *)(prt))->pBsCurByte = ((IppBitstream *)(prt))->pBsBuffer, /
((IppBitstream *)(prt))->bsByteLen = 0, /
((IppBitstream *)(prt))->bsCurBitOffset = 0, /
((IppBitstream *)(prt)))
对这个进行初试化
输出buffer实际上就是一个内部复用buffer
IppBitstream *pbufInfo = encoder_data->pBufOut;
初试化的时候创建自己的内部复用buffer
pbufInfo->pBsBuffer = (Ipp8u*)malloc(pbufInfo->bsByteLen
vrec_h264_encoder_close
关闭有没有问题 ?
camrec_video_preview
目前只是简单的采集视频 自己进行采集的打开和关闭
camrec_video_cap
这个自成一体,自己采集编码 自己打开关闭
没有预览就再编码
高质量模式编码器不能重复使用