当前位置:编程学习 > C/C++ >>

修改AVI的录像尺寸

模糊的原因是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 也要做修改。
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,