首页 > 代码库 > X264支持输入NV12格式
X264支持输入NV12格式
X264支持输入NV12格式
一般编码器(例如JM)输入格式是YUV420(YV12),H.264标准也介绍的是YUV420的输入。X264编码器的输入也一般是YUV420格式,但是在内部帧的存储方式上x264采用的是NV12。因为一般编码器对U,V两通道的处理方式是相同的,例如他们有相同的QP,宏块划分,参考帧ID,运动矢量。因此对于U,V两通道的数据读取是一致的,这样NV12 UV两通道交织存储比YV12 UV两通道分别存储在数据访问上具有更高的效率。基于这样的考虑,x264内部帧(包括输入编码帧,参考帧)采用了NV12的存储方式。对于YUV422的输入采用NV16的格式
函数 int x264_frame_copy_picture( x264_t *h, x264_frame_t *dst, x264_picture_t *src )里面会将src->img.i_csp 转换成NV12等相对应的存储格式。
输入 输出
NV12, I420, YV12 => NV12
NV16, I422, YV16, V210 => NV16
I444, YV24,BGR,BGRA,RGB => I444
因此x264可以直接输入NV12的视频数据格式(一些移动端摄像头的输出为NV12),并且比输入YUV420的效率还更高一些。
具体代码为:
x264_picture_init( &pH264Enc->pic );
if(chroma_fmt == X264_CSP_NV12){
pH264Enc->pic.img.i_stride[0] = pH264Enc->param.i_width;
pH264Enc->pic.img.i_stride[1] = pH264Enc->param.i_width;
pH264Enc->pic.img.i_stride[2] = 0;
pH264Enc->pic.img.i_csp = X264_CSP_NV12;
pH264Enc->pic.img.i_plane = 2;
} else { // 其他暂认为都是YUV420格式
pH264Enc->pic.img.i_stride[0] = pH264Enc->param.i_width;
pH264Enc->pic.img.i_stride[1] = pH264Enc->param.i_width>>1;
pH264Enc->pic.img.i_stride[2] = pH264Enc->param.i_width>>1;
pH264Enc->pic.img.i_csp = X264_CSP_I420;
pH264Enc->pic.img.i_plane = 3;
}
附上x264 CSP格式定义:
#define X264_CSP_MASK 0x00ff /* */
#define X264_CSP_NONE 0x0000 /* Invalid mode */
#define X264_CSP_I420 0x0001 /* yuv 4:2:0 planar */
#define X264_CSP_YV12 0x0002 /* yvu 4:2:0 planar */
#define X264_CSP_NV12 0x0003 /* yuv 4:2:0, with one y plane and one packed u+v */
#define X264_CSP_I422 0x0004 /* yuv 4:2:2 planar */
#define X264_CSP_YV16 0x0005 /* yvu 4:2:2 planar */
#define X264_CSP_NV16 0x0006 /* yuv 4:2:2, with one y plane and one packed u+v */
#define X264_CSP_V210 0x0007 /* 10-bit yuv 4:2:2 packed in 32 */
#define X264_CSP_I444 0x0008 /* yuv 4:4:4 planar */
#define X264_CSP_YV24 0x0009 /* yvu 4:4:4 planar */
#define X264_CSP_BGR 0x000a /* packed bgr 24bits */
#define X264_CSP_BGRA 0x000b /* packed bgr 32bits */
#define X264_CSP_RGB 0x000c /* packed rgb 24bits */
#define X264_CSP_MAX 0x000d /* end of list */
#define X264_CSP_VFLIP 0x1000 /* the csp is vertically flipped */
#define X264_CSP_HIGH_DEPTH 0x2000 /* the csp has a depth of 16 bits per pixel component */
一般编码器(例如JM)输入格式是YUV420(YV12),H.264标准也介绍的是YUV420的输入。X264编码器的输入也一般是YUV420格式,但是在内部帧的存储方式上x264采用的是NV12。因为一般编码器对U,V两通道的处理方式是相同的,例如他们有相同的QP,宏块划分,参考帧ID,运动矢量。因此对于U,V两通道的数据读取是一致的,这样NV12 UV两通道交织存储比YV12 UV两通道分别存储在数据访问上具有更高的效率。基于这样的考虑,x264内部帧(包括输入编码帧,参考帧)采用了NV12的存储方式。对于YUV422的输入采用NV16的格式
函数 int x264_frame_copy_picture( x264_t *h, x264_frame_t *dst, x264_picture_t *src )里面会将src->img.i_csp 转换成NV12等相对应的存储格式。
输入 输出
NV12, I420, YV12 => NV12
NV16, I422, YV16, V210 => NV16
I444, YV24,BGR,BGRA,RGB => I444
因此x264可以直接输入NV12的视频数据格式(一些移动端摄像头的输出为NV12),并且比输入YUV420的效率还更高一些。
具体代码为:
x264_picture_init( &pH264Enc->pic );
if(chroma_fmt == X264_CSP_NV12){
pH264Enc->pic.img.i_stride[0] = pH264Enc->param.i_width;
pH264Enc->pic.img.i_stride[1] = pH264Enc->param.i_width;
pH264Enc->pic.img.i_stride[2] = 0;
pH264Enc->pic.img.i_csp = X264_CSP_NV12;
pH264Enc->pic.img.i_plane = 2;
} else { // 其他暂认为都是YUV420格式
pH264Enc->pic.img.i_stride[0] = pH264Enc->param.i_width;
pH264Enc->pic.img.i_stride[1] = pH264Enc->param.i_width>>1;
pH264Enc->pic.img.i_stride[2] = pH264Enc->param.i_width>>1;
pH264Enc->pic.img.i_csp = X264_CSP_I420;
pH264Enc->pic.img.i_plane = 3;
}
附上x264 CSP格式定义:
#define X264_CSP_MASK 0x00ff /* */
#define X264_CSP_NONE 0x0000 /* Invalid mode */
#define X264_CSP_I420 0x0001 /* yuv 4:2:0 planar */
#define X264_CSP_YV12 0x0002 /* yvu 4:2:0 planar */
#define X264_CSP_NV12 0x0003 /* yuv 4:2:0, with one y plane and one packed u+v */
#define X264_CSP_I422 0x0004 /* yuv 4:2:2 planar */
#define X264_CSP_YV16 0x0005 /* yvu 4:2:2 planar */
#define X264_CSP_NV16 0x0006 /* yuv 4:2:2, with one y plane and one packed u+v */
#define X264_CSP_V210 0x0007 /* 10-bit yuv 4:2:2 packed in 32 */
#define X264_CSP_I444 0x0008 /* yuv 4:4:4 planar */
#define X264_CSP_YV24 0x0009 /* yvu 4:4:4 planar */
#define X264_CSP_BGR 0x000a /* packed bgr 24bits */
#define X264_CSP_BGRA 0x000b /* packed bgr 32bits */
#define X264_CSP_RGB 0x000c /* packed rgb 24bits */
#define X264_CSP_MAX 0x000d /* end of list */
#define X264_CSP_VFLIP 0x1000 /* the csp is vertically flipped */
#define X264_CSP_HIGH_DEPTH 0x2000 /* the csp has a depth of 16 bits per pixel component */
X264支持输入NV12格式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。