程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 修改AVI的錄像尺寸

修改AVI的錄像尺寸

編輯:C++入門知識

模糊的原因是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 也要做修改。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved