上一篇分析了当飞机空中端接收用户地面端发送的拍照命令后,软件回调的执行。但是还没有说明图片的存储和传送这块还没有分析到。所以接下来就是分析图片的存储和发送流程。
通过终端的调试打印信息来看,当接收到地面端的拍照指令后,执行文件app\video\process\nv12_process.cpp中的类NV12_MJPG中的公有成员方法StreamPUBase中的函数processFrame。主要是获取拍照的分辨率然后根据分辨率分配ion内存的大小。
bool processFrame(shared_ptr<BufferBase> inBuf, shared_ptr<BufferBase> outBuf)
video_rga_photo_process(video, inBuf->getFd(), inBuf->getWidth(), inBuf->getHeight(), inBuf->getVirtAddr());
video_ion_alloc(&video->photo.rga_photo, width, height)
video_ion_alloc_rational(video_ion, width, height, 3, 2);
video_ion_alloc_buf(video_ion);
vpu_nv12_encode_jpeg_doing(&video->photo.encode[video->photo.num],
buffer, fd, size_ext);
分配了ion内存后,调用vpu_nv12_encode_jpeg_doing(&video->photo.encode_ext[video->photo.num], buffer_ext, fd_ext, size_ext);就开始执行驱动部分的代码 kernel/arch/arm/mach-rockchip/vcodec_service.c。这里应该就是调用了底层的摄像头硬件作出牌照操作。
pr_info("%s: power on\n", dev_name(pservice->dev));对应的log信息:vcodec_service: 30000000.vpu_service: power on
rk1108\app\video\process\video.cpp
video_record_addvideo(int id,struct ui_frame* front,struct ui_frame* back,struct ui_frame* cif,char rec_immediately,char check_record_init)
pthread_create(&video->record_id, &attr, video_record, video)
static void* video_record(void* arg)
{
...
while (video-