x264_picture_alloc()

 

/*x264_picture_alloc() 按照色度空间分配内存,并返回内存的首地址作为指针

我们常说得YUV420属于planar格式的YUV,使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。在常见H264测试的YUV序列中,例如CIF图像大小的YUV序列(352*288),在文件开始并没有文件头,直接就是YUV数据,先存第一帧的Y信息,长度为352*288个byte, 然后是第一帧U信息长度是352*288/4个byte, 最后是第一帧的V信息,长度是352*288/4个byte, 因此可以算出第一帧数据总长度是352*288*1.5,即152064个byte, 如果这个序列是300帧的话, 那么序列总长度即为152064*300=44550KB,这也就是为什么常见的300帧CIF序列总是44M的原因.*/

x264_picture_alloc()_第1张图片

int x264_picture_alloc( x264_picture_t *pic, int i_csp, int i_width, int i_height ) { pic->i_type = X264_TYPE_AUTO; 指明被编码图像的类型,有X264_TYPE_AUTO X264_TYPE_IDR X264_TYPE_I X264_TYPE_P X264_TYPE_BREF X264_TYPE_B可供选择,初始化为AUTO,说明由x264在编码过程中自行控制。 pic->i_qpplus1 = 0; 强制量化器,此参数减1代表当前画面的量化参数值。 pic->img.i_csp = i_csp; 图像颜色空间参数,目前只支持I420/YUV420. pic->img.i_plane = 3; 颜色空间数目,如I420是3 pic->img.plane[0] = x264_malloc( 3 * i_width * i_height / 2 ); if( !pic->img.plane[0] ) return -1; pic->img.plane[1] = pic->img.plane[0] + i_width * i_height; pic->img.plane[2] = pic->img.plane[1] + i_width * i_height / 4; pic->img.i_stride[0] = i_width; pic->img.i_stride[1] = i_width / 2; pic->img.i_stride[2] = i_width / 2; pic->param = NULL; return 0; } —————————————————————————————————————————————— void *x264_malloc( int i_size ) { uint8_t *align_buf = NULL; #ifdef SYS_MACOSX /* Mac OS X always returns 16 bytes aligned memory */ align_buf = malloc( i_size ); #elif defined( HAVE_MALLOC_H ) align_buf = memalign( 16, i_size ); #else uint8_t *buf = malloc( i_size + 15 + sizeof(void **) + sizeof(int) );返回指向分配域起始地址的指针,buf值为0x00b9dca0 if( buf ) { align_buf = buf + 15 + sizeof(void **) + sizeof(int);//此处执行完后align_buf后的值为0x00b9dcb7. align_buf -= (intptr_t) align_buf & 15; //typedef _W64 int intptr_t;,_W64就是__w64,是为了解决32位与64位编译器的兼容性而设置的关键字 用于指针运算 。此处执行完后align_buf后的值为0x00b9dcb0. *( (void **) ( align_buf - sizeof(void **) ) ) = buf; *( (int *) ( align_buf - sizeof(void **) - sizeof(int) ) ) = i_size; } #endif if( !align_buf ) x264_log( NULL, X264_LOG_ERROR, "malloc of size %d failed/n", i_size ); return align_buf; } 

 

你可能感兴趣的:(OS,测试,null,byte,编译器)