当前位置: 代码迷 >> 综合 >> 修改 AVI 的录像尺寸
  详细解决方案

修改 AVI 的录像尺寸

热度:74   发布时间:2024-01-19 20:24:53.0
模糊的原因是RESIZE导致,所以可以适当地把录像尺寸改大(仅适合于 MJPEG),以减轻RESIZE的复作用。 
[ 注 ] 如果加大录像尺寸,会引起一系列的问题,如 帧率需要降低; file system 来不及去写数据; memory 不够用等,所以要择中选择。 
在 “vid_preview_req_hdlr()” 里去改录像的大小, 
width 必须为 16 的倍数, 
对应的 memory 的申请与释放也要做修改(intermal memory 不够要改用 external memory), 用于 YUV 的 memory要 16 byte 对齐。 
1) 根据情况增加 MED 的 memory size,增大宏 "MAX_VID_ENC_EXT_MEM_SIZE" 我将其改为 115 * 1024 
2) 为了修改方便增加两个宏定义,可以在文件 "vid_msg_handler_mjpg.c" 中 
 #define AVI_RECORD_WIDTH (288) 
 #define AVI_RECORD_HEIGHT (236) 
----------- 下面过程如无说明均为修改函数 "vid_preview_req_hdlr()" ------------------ 
3) 在 req_p = (media_vid_preview_req_struct*)ilm_ptr->local_para_ptr; 后面增加下面两句 
 req_p->image_width = AVI_RECORD_WIDTH; 
 req_p->image_height = AVI_RECORD_HEIGHT; 
当然这里的 width 和 height 是从上层带下来的,可以自己跟代码进行修改。 
4) 把 vid_context_p->mjpeg_y_buf_p = (kal_uint32)med_alloc_int_mem(vid_context_p->mjpeg_y_buf_size); 修改为 
 vid_context_p->mjpeg_y_buf_p = (kal_uint32)med_alloc_ext_mem(vid_context_p->mjpeg_y_buf_size); 
即使用 ext mem,因为不能随意去增大 int mem,所以改用 ext mem。 
同样,vid_context_p->mjpeg_u_buf_p 和 vid_context_p->mjpeg_v_buf_p 都改用 ext mem 
5) 关于这几个 buffer size 的计算为 
if(AVI_RECORD_WIDTH % 16) 
{ 
 ASSERT(0); //width must be 16X 
} 
else 
{ 
 if(AVI_RECORD_HEIGHT % 16) 
 { 
 vid_context_p->mjpeg_y_buf_size = AVI_RECORD_WIDTH * (((AVI_RECORD_HEIGHT >> 4) + 1) << 4); 
 } 
 else 
 { 
 vid_context_p->mjpeg_y_buf_size = AVI_RECORD_WIDTH * AVI_RECORD_HEIGHT; 
 } 
} 
vid_context_p->mjpeg_u_buf_size 和 vid_context_p->mjpeg_v_buf_size 为 (vid_context_p->mjpeg_y_buf_size)/4 
6) 将这只函数中的其它 176 数字改为 AVI_RECORD_WIDTH 
7) 修改函数 "vid_release_recorder_memory()" 
把 med_free_int_mem((void **)&vid_context_p->mjpeg_y_buf_p); 改为 med_free_ext_mem((void **)&vid_context_p->mjpeg_y_buf_p); 
同样 vid_context_p->mjpeg_u_buf_p 和 vid_context_p->mjpeg_v_buf_p 也要做修改。
  相关解决方案